将子视图添加到headerview:添加到错误的部分

时间:2016-04-05 06:11:12

标签: ios objective-c iphone uitableview

我有一个包含2个部分的桌面视图

df1 <- read.table(text="a1  a2  a3
 a   1   45
 b   2   55
 c   4   34
 d   3   87", sep="", header=TRUE, stringsAsFactors=FALSE)

我想在第0部分添加标签。

-(NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section {
  switch (section) { 
    case 0: return @"s1"; 
    case 1: return @"s2"; 
  } 
}

它适用于初始显示。

然后我使用presentViewController弹出一个摄像机Image Picker,但每当我关闭图像选择器,并返回当前视图时,&#34; test&#34;标签将分别位于第0部分和第1部分。

意味着将会有2&#34;测试&#34;在这两个部分中。

如果我使用

-(void) tableView:(UITableView *)tableView willDisplayHeaderView(nonnull UIView *)view forSection:(NSInteger)section {
  if (section == 0) {
    for (UIView *subView in view.subviews) {
      if (subView.tag == 99) {
         [subView removeFromSuperview];
         break;
      }
    }

    UITableViewHeaderFooterView *headerView = (UITableViewHeaderFooterView *)view;
    UILabel *label = [[UILabel alloc]initWithFrame:CGRectMake([[UIScreen mainScreen] bounds].size.width - 150 - headerView.textLabel.frame.origin.x, headerView.textLabel.frame.origin.y, 150, hederView.textLabel.frame.size.height)];

    label.text = @"test";
    label.tag = 99;
    [headerView addSubview:label];
  }
}

这将删除额外的&#34;测试&#34;来自第1节。

有没有可能的原因?我试图调试并且看不到有关为什么会发生这种情况的任何有用的东西,因为在if(section == 0)块完成运行后,它将进入汇编模式,如果我继续从中断运行,第1部分将显示&# 34;测试&#34;,我不知道它来自哪里。

我不是要求解决方案(我有一个,只是为了删除第1部分中的标签99标签),我要求理由和任何我做错的地方。

任何建议将不胜感激。非常感谢你。

2 个答案:

答案 0 :(得分:1)

第一次instantiate UITableViewController课程时,TableView会为您的两个部分重新加载两个不同的视图。当您返回到相同的UITableViewController时,不会实例化新实例。但是,您可能会在reloadData()viewWillAppear进行viewDidAppear来电。现在,TableView重新加载,之前的views已重新用于Headers。先前实例化中第1部分的view1现在成为第0部分的视图。(此时,您为此视图添加UILabelsubView 1)先前实例化的view0现在成为第1部分的视图。(它之前的实例化已经标记为subView)。因此,当您返回到同一TableViewController并且由于未再次实例化时,标题的两个视图都标记为subView

您可以避免显示来自视图的reloadData()来电并且看起来很好或遵循overriding方法的最佳做法

func tableView(tableView: UITableView, viewForHeaderInSection section: Int) ->     UIView?

答案 1 :(得分:0)

您可以按以下方式添加标题..

添加两个功能

func tableView(tableView:UITableView,heightForHeaderInSection section:Int) - &gt; CGFloat {

            return 40.0
    }



func tableView(tableView: UITableView, viewForHeaderInSection section: Int) -> UIView? {
    let vw_header : UIView = UIView()
    vw_header.frame = CGRectMake(10, 0, ScreenSize.SCREEN_WIDTH, 40)
    vw_header.backgroundColor = Validation.getColorByRGB(227, G: 227, B: 227)
    vw_header.layer.borderWidth = 1
    vw_header.layer.borderColor = UIColor.darkGrayColor().CGColor


    let txtHeaderText : UILabel = UILabel()
    txtHeaderText.frame = CGRectMake(5, 0, ScreenSize.SCREEN_WIDTH, 40)
    txtHeaderText.textColor = appTextPurpleColor
    txtHeaderText.textAlignment = NSTextAlignment.Left
    txtHeaderText.text = “Simple Header”

    vw_header.addSubview(txtHeaderText)

    return vw_header
}

现在,您可以根据需要自定义标题部分视图