首页 文章

如何在不使用Storyboard的情况下在UITableView中使用静态单元格?

提问于
浏览
30

我的项目中有一个现有的ViewController xib,现在我想添加一个带静态单元格的UITableView,如下所示:

TableView with static cells

但是当我将UITableView拖到我的屏幕上时,我没有在Attributes Inspector中有“Content> Static”菜单 .

我已经尝试制作我的控制器子类UITableViewController,但这没有帮助 - 我仍然没有选择在Attributes Inspector中使用静态单元格 .

我查看了StackOverflow,但没有找到这个问题的任何现有答案 . 所有现有问题都与Storyboard(我没有使用)有关,而不是xib文件 .

我的猜测是,当你将一个UITableViewController添加到一个故事板时,Xcode会产生某种魔力,但是当你将现有的xib更改为从UITableViewController继承时,它不会 .

有关如何将静态单元格的表格视图添加到现有xib的任何建议吗?

3 回答

  • 23

    静态表格视图单元格仅在使用故事板时可用 . 但是,如果您没有为整个UI使用故事板,您仍然可以将它们用于单个屏幕而不是屏幕集合 .

    为此,您可以创建一个UIStoryboard文件,其上有一个视图控制器,其文件所有者设置为您的自定义视图控制器子类 . 将VC的标识符设置为某个值 . 当您想要显示它时,获取故事板,然后通过从故事板创建VC来实例化视图控制器子类 .

    UIStoryboard *tableViewStoryboard = [UIStoryboard storyboardWithName:@"your storyboard" bundle:nil];
    CustomViewController = [tableViewStoryboard instantiateViewControllerWithIdentifier:@"custom identifier"];
    

    您可以像往常一样在应用中展示此VC .

    这是开始使用故事板而不必转换整个应用程序以使用它们的好方法 .

  • 45

    没有故事板,这是可行的:

    • 你的控制器必须采用tableview委托和源代码的协议... UITableViewDelegate,UITableViewDataSource

    • 为.xib添加表格视图;将表格视图的样式设置为"grouped"

    • 将表格连接到控制器中的属性(让我们称之为"yourTableView")

    • 将表格视图单元格添加到.xib作为单独的视图...即 . 不作为表视图的子视图......它们将自由浮动在.xib中 . (见下面的示例图片)

    • 向表格单元格添加控件/标签等 .

    • 为每个表格视图单元格的“属性”中的"Identifier"字段指定唯一字符串 .

    • 将表格单元格连接到控制器中的其他属性(sliderCell,switchCell等)

    • 将单元格控件的发送事件连接到控制器中的IBAction-ed方法 - (IBAction)handleSliderCell等 .

    • 在控制器的viewDidLoad方法中,将表视图的委托和源分配给控制器(self.yourTableControl.delegate = self; self.yourTableControl.dataSource = self;)

    • 在控制器中实现numberOfSectionsInTableView,numberOfRowsInSection和cellForRowAtIndexPath
      在tableView:cellForRowAtIndexPath:中

    • ,返回yourFirstCell,yourSecondCell等指针以获取适当的indexPath值

    表格单元格控件的事件应该转到处理程序例程......

    步骤4的示例:
    xib

  • 0

    为了扩展BVB的答案,当涉及到10号时,这里是用于tableview委托方法的Swift 3片段 . 务必为xib中的所有单元添加插座 .

    手动创建表视图节时,请记住 indexPath 等于表示表结构的二维数组 . 例如,当 indexPath 传递给 tableView(cellForRowAt indexPath: IndexPath) 等于 [1][0] 时,您的单元格将被放置在第二部分的第一个位置 .

    可以使用 indexPath.rowindexPath.section 属性从 indexPath 中拉出值 . 使用这些值,您可以按照您喜欢的顺序从IBOutlets手动构建节 .

    @IBOutlet var is_enabled: UITableViewCell!
    @IBOutlet var is_public: UITableViewCell!
    
        func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
        switch(section){
            case 0:
                return "Cell 1"
            case 1:
                return "Cell 2"
            default: return ""
    
        }
    }
    
    func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
        return 1
    }
    
    func numberOfSections(in tableView: UITableView) -> Int {
        return 2
    }
    
    func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
        print("index path here", indexPath)
        if(indexPath.section == 0)  {
            return is_enabled
        }
        else if(indexPath.section == 1) {
            return is_public
        } else {
            return is_enabled
        }
    }
    

相关问题