如何在 iPhone 的 Interface Builder 中构建 UITableView 部分的标题视图?
Posted
技术标签:
【中文标题】如何在 iPhone 的 Interface Builder 中构建 UITableView 部分的标题视图?【英文标题】:How to build UITableView sectionHeader views in Interface Builder for iPhone? 【发布时间】:2010-07-20 19:16:38 【问题描述】:我的 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”...
提前致谢, 标记。
【问题讨论】:
你可能想从你的 if() 语句中拉出返回值,它会抛出警告,因为编译器运行代码,它不会像我们一样通过步骤,所以它到达终点并且没有得到“返回 someObject”,并且它不知道您在到达终点之前已经抛出了一个值。我设置了一个 tempObject,例如: UIView *tempView;然后我将它设置为等于 if() 语句中所需的值,如您的 return [favoritesSectionHead view];然后在方法结束时,我返回 tempObject,如“return tempView;”没有警告! 【参考方案1】:您的视图尚未加载。这就是为什么它为零。在 ViewDidLoad 中做你的修改代码。
我有一个类似的问题,我在初始化标头后尝试编辑标签值,但我但标签都是零。我通过从标题视图控制器的 viewDidLoad 方法调用标签修改代码解决了这个问题。
【讨论】:
【参考方案2】: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,在复杂的 TabBar 中对我不起作用,使用 UINavigationControllers。
@interface YourViewController : UIViewController <UITableViewDelegate, UITableViewDataSource, UIAlertViewDelegate, UIAccelerometerDelegate>
创建所有显示在您视野中的 IBOutlets:
IBOutlet UITableView *myTableView;
IBOutlet UIView *yourCustomHeaderView;
IBOutlet UIImageView *yourImageOnCustomView;
Assign 内存分配分配:
@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 中建立所有联系,最简单的方法:
-
使用“列表视图”查看您的对象,提供更好的理解和对象层次结构
右键单击您的“文件所有者”,显示您所有的 IBOutlets;
将所有 IBOutlet 连接从文件所有者拖到他们控制的对象;即(yourTableView -> tableView)或 yourCustomHeaderView -> 您设计的自定义视图)和(yourImage -> 您放置在自定义 View 上的自定义 UIImageView。
现在已经建立了连接,您可以“完全”控制每个项目的各个方面,方法是设置该项目的任何属性,例如 self.yourCustomHeaderView.background = [UIColor redColor]; etc....
** 确保从“TableView”拖动到“File's Owner”以将表的(委托)和(数据源)设置回文件的所有者;这恰好是所有 tableView 委托方法所在的地方!
这只是最简单的步骤,您可以根据需要使视图变得复杂,我的 viewForHeaderInSection 之一:视图有 40 多个 IBoutets 用于所有视图,包括按钮、图像、标签、其他视图等...
真的试图将所有代码保留在“代码块”中,只是行不通,但您仍然可以阅读它。
【讨论】:
嗨 Newbyman,感谢您非常详细的回答。正如您在上面的答案中看到的那样,我的问题是另一个问题(我没有正确遵循 MVC 模式),但我相信其他人会遇到您的解决方案适合的问题,并且很高兴在这里找到它! 【参考方案3】:我必须在我的剖面视图控制器中添加一个 NSString 属性。在 viewDidLoad 中,我将此字符串分配给 UILabel 文本属性,现在它可以工作了。
【讨论】:
以上是关于如何在 iPhone 的 Interface Builder 中构建 UITableView 部分的标题视图?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用主 iPhone 视图之外的 UI 元素在 Interface Builder 中设置 UIScrollView?
在 Interface Builder 中为 Iphone 创建弹出视图控制器