【问题标题】:How to display a complex UIViewController inside another UIView Controller?如何在另一个 UIViewController 中显示复杂的 ViewController?
【发布时间】:2012-06-27 12:56:06
【问题描述】:

好的,情况就是这样。我目前有一个名为MainViewController 的视图控制器,它有一个带有许多不同单元格的 UITableView。当我单击一个单元格时,我希望该单元格展开(增加高度)并显示一些“附加信息”。问题是,这个附加信息非常复杂,可以包含 UILabel、其他 UITableViews、UIWebViews 和 UIImageViews。此外,这个“附加数据”需要相当多的计算才能确定要显示的确切内容(即 UILabel 所说的内容,UIImageView 的大小)。因此,由于这种“附加信息”的复杂性,我不知道如何设计我的程序。

“附加信息”需要大量代码,因此我不想只是将该代码扔到MainViewController. 此外,如果有某种方法可以使用 Interface Builder 来设计这些“附加信息”,那就太好了信息”以图形方式而非编程方式查看。

目前,我将每组附加信息作为其自己单独的 UIViewController(因此允许我为数据拥有单独的类并允许我使用界面构建器),并且在选择单元格时我只是转到新屏幕。但是,我不想切换到新屏幕;我希望这个 UIView 控制器显示的所有数据都显示在MainViewController 中。最好的方法是什么?

总之,我目前有一个 UIViewController 连接到另一个 UIViewController;但是,我希望第二个 UIViewController 的内容显示在第一个中。如果可能的话,我想使用某种 Interface Builder 并将第二个 UIViewController 的逻辑分离到另一个类中。

详情: ~ 我只为 iOS 5 开发,我正在使用 ARC。 ~ 我以前从未为 iOS 4 或更低版本开发过,也从未使用过 nib 文件,但如果需要我愿意学习。简单的示例代码会很有帮助。 ~ 谢谢!

【问题讨论】:

    标签: iphone objective-c ios xcode uiviewcontroller


    【解决方案1】:

    与 SmartWork 意见相同。

    您应该使用其 xib 文件创建自定义 UITableViewCell 类,并将 UITableViewCell 作为主 xib 视图

    在您的 tableView 数据源中,您可以将其导入如下:

    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
        static NSString *CellIdentifier = @"MyViewCell";
        MyViewCell *cell = (MyViewCell *)[self.tableView dequeueReusableCellWithIdentifier:CellIdentifier];
        if (cell == nil) {
            NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"MyViewCell" owner:nil options:nil];
            for (id currentObject in topLevelObjects) {
                if ([currentObject isKindOfClass:[UITableViewCell class]]) {
                    cell = (MyViewCell *)currentObject;
                    break;
                }
            }
        }
        [self configureCell:cell atIndexPath:indexPath]; // your own function to customize your cell.
        return cell;
    }
    

    然后,在cell xib中,可以设置cell的最大高度,在UITableViewDelegate类中决定有效高度。

    【讨论】:

      【解决方案2】:

      这里有一些很好的建议,但请注意,loadNibNamed:owner: 是一个相当昂贵的 API,需要重复调​​用,因为它每次都从文件系统读取 nib。相反,请考虑做这样的事情。

      viewDidLoad 注册您的笔尖文件。在 Interface Builder 中,确保为您的自定义单元格提供重用标识符。

      - (void)viewDidLoad
      {
          [super viewDidLoad];
      
          UINib *myNib = [UINib nibWithNibName:@"MyNib" bundle:nil];
          [self.tableView registerNib:myNib forCellReuseIdentifier:@"MyCell"];
      
          // Do any other stuff you need to do...
      }
      

      然后,只要您需要,只需将您的自定义单元格出列即可。 UINib 会将 nib 文件缓存在内存中,以避免每次从文件系统重新加载它。

      - (UITableViewCell *)tableView:(UITableView *)tableView
               cellForRowAtIndexPath:(NSIndexPath *)indexPath
      {
          UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"MyCell"];
      
          // Configure cell as needed...
      
          return cell;
      }
      

      【讨论】:

        【解决方案3】:

        在我看来,没有必要在另一个 UiviewController 中使用。

        您可以将 Uiview 与 nib 文件一起使用,因此您可以以图形方式设计这些“附加信息”视图。它很容易实现和维护。

        【讨论】:

        • 如果我有一个 nib 图形文件,您是否有任何示例代码说明如何以编程方式创建这些 UIView 之一?
        • 你只需要在那个uiview中创建一个uiview你可以包含tableview、labels和buttons。
        【解决方案4】:

        只是为了补充 SmartWork 所说的,当您点击特定单元格时,您可以使用以下代码行更新该行的高度:

        - (CGFloat)tableView:(UITableView *)aTableView heightForRowAtIndexPath:(NSIndexPath *)indexPath 
        { 
             // set a dynamic value for the cell height depending on the state of the data in the cell 
        }
        
        - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath 
        { 
        
            // update the state of the data in the cells here..  
            // calling these below lines will change the height of the cells smoothly 
        
        
            [tableView beginUpdates]; 
            [tableView endUpdates]; 
        
        }
        

        您还需要自定义 UITableViewCells。将它们视为简单视图,并添加和删除您需要的任意数量的子视图

        如果您热衷于将 Nibs 用于单元格内的子视图,您可以创建它们的 nibs 并将它们连接到自定义 TableView 单元格,如下所示:(子视图可以是 tableViewCell 的属性)

        NSArray *nibArray = [[NSBundle mainBundle] loadNibNamed:@"MyTableViewCellNib" owner:self options:nil];
        
        mySubview = [(SubView *)[nib objectAtIndex:0]retain];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-09-17
          • 2013-03-12
          • 2023-03-05
          • 2023-03-08
          • 1970-01-01
          • 2013-10-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多