例如我们在tableview中使用此方法
- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
return 16;
}
我想知道我们不会在任何地方调用此方法,但应用程序读取此值是怎么回事?有很多这样的方法,我们没有打电话。
答案 0 :(得分:11)
您的对象已被设置为某处UITableView的数据源。最有可能的是,通过在InterfaceBuilder中建立连接,尽管通过设置UITableView的dataSource
属性可以直接在代码中这样做:
- (void) setUpMyJunkMan
{
myTableView.dataSource = self;
}
将对象设置为数据源后,表视图将根据需要调用方法,以确定需要绘制的内容或响应事件的方式。
您的对象需要实现UITableViewDataSource
协议(但是,如果您通过InterfaceBuilder连接数据源,则可能没有投诉,如果您不这样做 - 它更多的是编译时验证而不是运行时一个。)
如果您查看UITableViewDataSource
的声明,您会发现许多方法都是@optional
。其余的是@required
;你必须实施它们才能履行协议的合同。
这是数据源和代理之间的关键区别。代理可以选择实现任何声明的方法。数据源在两个对象之间创建了更为正式的关系,其中必须实现一些方法。
答案 1 :(得分:1)
一种简单的方法,可以了解调用方法的原因 - 设置断点,在调试模式下运行,然后查看堆栈跟踪。
对于这种特殊情况 - 框架在呈现表视图时会自动调用它。
我认为你真的需要看一下The Table View Programming Guide,这样你就可以很好地理解在使用表格视图时需要覆盖(而不是覆盖)的方法。如果你正在扩展TableViewController类,框架会做很多繁重的工作,你几乎不需要编写任何代码。
答案 2 :(得分:-1)
numberOfSectionsInTableView:
。
您实施numberOfSectionsInTableView:
作为UITableViewDataSource
协议的一部分。每个UITableView
都会获得dataSource
。通常,UITableView
将由UITableViewController
构建,dataSource
将自己设置为视图的numberOfSectionsInTableView:
。
显示视图后,它会在dataSource
上调用{{1}}。
答案 3 :(得分:-4)
这是代理接口的一部分。
在应用程序的某个时刻(可能在您的UIBuilder中),您已指定包含该方法的对象实际上是委托对象。这意味着当你想调整行为时(在这种情况下是UITableView),你可以在不实际扩展UITableView的情况下,但可以大量改变委托方法。
基本上UITableView类看起来像这样。
- (void) AMethodinUiTableView
{
int colums =[self.delegate numberOfSectionsInTableView:self];
}
了解更多信息,我会查看delgate编程和选择器。