向下滚动时阻止创建UITableViewCells

时间:2013-05-15 05:36:12

标签: ios objective-c uitableview

我正在创建一个使用视觉上类似于iOS原生电子邮件应用的邮件屏幕。它看起来像这样(两个图像都是同一个屏幕。第一个是上半部分,第二个是其余部分)。

enter image description here

enter image description here

不同之处在于,除了正常的抄送 Subjet 字段外,我的邮件屏幕还有更多自定义字段。

我正在使用UITableViewController来创建它。下面是一个代码片段,它创建一个单元格(对于每个单元格它几乎相同)。

- (UITableViewCell *)tokenTableView:(TITokenTableViewController *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {

    UITableViewCell *cell = nil;
    self.tableView.frame = CGRectMake(0,0,320,320);
    UIView *contentSubview = nil;

    cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:CellIdentifierSubject];
        if(!self.txtSubject) {

            self.txtSubject = [[UITextField alloc] initWithFrame:CGRectMake(0, 0, 0, 0)];
            self.txtSubject.frame = CGRectMake(10, cell.frame.size.height / 2 - self.txtSubject.font.lineHeight / 2, tableView.tableView.bounds.size.width, 30);

            self.txtSubject.placeholder = @"Subject";
            [self setupMailData:indexPath.row];
        }
    contentSubview = self.txtSubject;
}

说,我打开一个草稿。输入字段中的所有细节都已填充,没有任何更改,我点击发送并崩溃了应用程序。我知道造成这种情况的原因。问题是,当您向下滚动时,通常会在屏幕的可视部分下面创建单元格,对吧?但是在这种情况下,如果我发送它而不向下滚动但视口下面的那些单元格不存在,那么就会抛出错误。

如果我打开草稿,向下滚动并点击发送,它可以正常工作。

我需要知道是否有办法立即创建所有这些单元格。甚至是最初位于视口下方的单元格。不依赖于用户向下滚动。

我希望你对我的情况有所了解。有人可以提出解决方案吗?

谢谢。

2 个答案:

答案 0 :(得分:0)

按照以下步骤操作:

  1. 选择uiscrollview并设置要显示的scrollview框架。
  2. 将uitableview作为uiscrollview的子视图
  3. 设置属性Scrolling Enabled = NO(取消选中.xib中的复选框)uitableview
  4. 调用uitableview的reloaddata方法
  5. 设置scrollview的tableview框架和内容大小

    tblEmail.frame = CGRectMake(yourXPos, yourYPos, yourWidth, tblEmail.contentSize.height);
    scrollObj.contentSize = CGSizeMake(yourScrollWidth,tblEmail.contentSize.height+10);
    
  6. 因此,tableview的高度等于其contentize。所以,它一次创建所有单元格。并且设置scrollview的内容大小等于tableview contentsize。所以,滚动功能就像uitableview滚动一样工作......

答案 1 :(得分:0)

使用Storyboard,添加 UITableViewController并将'Content'设置为StaticCells 。 然后,您可以在故事板中定义所有单元格及其内容。您甚至可以在UITableViewController子类中连接到IBOutlets,并且当viewDidLoad被触发时它们将全部为您提供...

使用Storyboard时,获取ViewController的代码如下所示:

[[UIStoryboard storyboardWithName:@"MyStoryboard" bundle:nil] instantiateInitialViewController];