我的iPhone应用程序中有一个分组样式的UITableView。 现在我想使用图像,标签和活动指示器自定义节标题。
为此,我创建了一个新的UIViewController子类和一个XIB文件。我将UIImageView,UILabel和UIActivityIndicatorView作为IBOutlet属性添加到ViewController,并将它们连接到我在Interface Builder中放入XIB的控件。
在我的UITableView制作的类中,我设置了节标题(两个,上面定义的ViewController的两个实例)并设置它们的属性(图像和文本)。然后我返回tableView委托中的ViewControllers视图:
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
if (section == 0) {
return [favoritesSectionHead view];
} else {
return [serverlistSectionHead view];
}
}
这显示了我在Interface Builder中定义的视图,没有自定义图像和文本。 我知道为什么会发生这种情况(ViewController的视图是在第一次需要时创建的,在我的代码中这是当我在viewForHeaderInSection方法中返回它时 - >当我尝试设置自定义值时视图仍为零)但是我不知道如何解决这个问题。
你能帮帮我吗?在返回之前,我需要做什么来启动视图? UITableView文档告诉我不要手动调用“loadView”...提前致谢, 标记
答案 0 :(得分:1)
我对view =(null)有同样的问题。这都是关于“代表”的。我的tableView工作正常,我的所有UITableView Delegate方法都正常工作,但是viewForHeaderInSection:不会实现。
我发现Xcode让我使用TableView建立弱链接引用,这对于“viewForHeaderInSection:”方法来说是不够的。
我还发现Xcode可以轻松地从viewForHeaderInSection:方法中推送“编码”自定义视图,使用相同的弱引用,但是使用IB,链接必须更加成熟。需要多做一些工作,但是一旦你把它弄下来构建更复杂的对象,就会提供更好的体验。
我使用:NSLog([NSString stringWithFormat:@"%@", self.headerView]);
来验证视图输出为(null)。
首先调用viewForHeaderInSection:方法,如果为nil或null,则tableView将调用“titleForHeaderInSection:”。 (你也可以利用这个优势)。
确保您的设置正确,并确定对象如何相互协作。
适合我的示例步骤:
(.h)中
正确设置viewController,并声明tableView委托方法。我使用的是通用的UITableViewController,在使用UINavigationControllers的复杂TabBar中无效。
@interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, UIAccelerometerDelegate> {
创建将在您的视图中的所有IBOutlet:
IBOutlet UITableView *myTableView;
IBOutlet UIView *yourCustomHeaderView;
IBOutlet UIImageView *yourImageOnCustomView;
分配内存分配分配:
@property(nonatomic,retain) IBOutlet UITableView *yourTableView;
@property(nonatomic,retain) IBOutlet UIImageView *yourCustomHeaderView;
@property(nonatomic,retain) IBOutlet UIImageView *yourImageOnCustomView;
(M)
合成您的变量:
@synthesize yourTableView, yourCustomHeaderView, yourImageOnCustomView;
实现所有标准的TableView委托所需方法,以及:
-(UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
//Intialize the header View to present:
UIView *headerView;
//Display Section Headers for rows:
if (section == 0) {headerStatBar = self.yourCustomSectionHeaderView1;}
if (section == 1) {headerView = self.yourCustomSectionHeaderView1;}
if (section == 1) {headerView = self.yourCustomSectionHeaderView1;}
//Return the view to the Table:
return headerView;
}
以最简单的方式在IB中建立所有连接:
现在已建立连接,您可以通过设置该项目的任何属性(例如self.yourCustomHeaderView.background = [UIColor redColor]; etc....
**确保从“TableView”拖动到“文件所有者”,将表(委托)和(数据源)设置回文件所有者;这恰好是所有tableView委托方法的所在!
这只是最简单的步骤,你可以根据需要使视图变得复杂,我的一个viewForHeaderInSection:视图有40多个IBoutets用于所有视图,包括按钮,图像,标签,其他视图等...
<小时/> 真的试图将所有代码保存在“代码块”中,但是不行,但你仍然可以阅读它。
答案 1 :(得分:1)
您的视图尚未加载。这就是为什么它没有。在ViewDidLoad中执行修改代码。
我有一个类似的问题,我在初始化标题后尝试编辑标签值,但我的标签都是零。我通过从标题视图控制器的viewDidLoad方法调用标签修改代码来解决问题。
答案 2 :(得分:0)
我必须在部分视图控制器中添加NSString属性。在viewDidLoad中,我将此字符串分配给UILabel文本属性,现在它正在工作。