首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS 從 UIView 子類中 Push 導航控制器

     編輯:程式設計綜合問答

問題背景

自定義 CategoryTableView 繼承 UIView,內部包含 UITableView。作為子視圖添加到 HomeViewController 中。需要在 didSelectRowAtIndexPath 中 push 新控制器,但 UIView 沒有導航控制器引用。

解決方案:持有父視圖控制器弱引用

CategoryTableView.h


@property (nonatomic, weak) UIViewController *parentViewController;

CategoryTableView.m


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // 通過父控制器訪問導航控制器
    [self.parentViewController.navigationController pushViewController:detailVC animated:YES];
    
    // 或模態彈出
    // [self.parentViewController presentViewController:detailVC animated:YES completion:nil];
}

父控制器中設置


// HomeViewController.m
CategoryTableView *tblView = [[CategoryTableView alloc] init];
tblView.parentViewController = self; // 設置弱引用
[self.view addSubview:tblView];

替代方案:代理模式

定義協議 CategoryTableViewDelegate,父控制器實現協議並作為代理,更解耦。

總結

UIView 子類需持有父 UIViewController 的弱引用(或代理)才能訪問導航控制器進行頁面跳轉。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved