2013-03-22 75 views
1

我有一個UIViewController命名爲 「的MainView」,並有一個UITableView名爲 「tblLists」
tblLists產生customCell - 「customCellList」。獲取的UIViewController在TableView中的CustomCell

我的問題是我可以在customCellList類中獲得MainView的實例(self)。

我嘗試了superview的東西,但沒有得到MainView。我想在沒有協議的情況下實現這一點

所以需要你的幫助。

+4

爲什麼要獲取對錶格視圖的引用?我認爲這可能不是一個好設計。 – rdelmar 2013-03-22 04:31:55

+1

單元不應該需要訪問它所在的視圖控制器。你想達到什麼目的?最有可能的是有一個更好的方法。 – rmaddy 2013-03-22 04:32:12

+1

我認爲使用*協議* **是你在Objective-c中完成它的方式。對不起,不是很有幫助。 – 2013-03-22 04:33:03

回答

2

你所問的不是一個好主意,你應該找到另一種方法。它打破了MCV模式。 順便說一下,如果你擔心使用ARC的內存問題,並且iOS> 5,你可以創建一個對錶視圖本身的弱引用,並將視圖控制器作爲它的委託或數據源屬性(當然如果VC是一個他們)。或者你可以創建一個對VC本身的弱引用。
正如評論中指出的不是一個好主意,更好地找到另一種方式。如果你需要更新你的單元格值,有很多方法來重新加載tableview數據!通過在你的VC上使用KVO,通知,委託等模型,你可以簡單地觸發重新加載到表視圖,而不涉及單元格中的奇怪引用。
希望這會有所幫助。

7

您可以使用responder鏈訪問視圖控制器。假設你customCell類是一個UITableViewCell子類,下面的方法應該做的工作:

@implementation customCell 

- (UIViewController *)getViewController 
{ 
    id vc = [self nextResponder]; 
    while(![vc isKindOfClass:[UIViewController class]] && vc!=nil) 
    { 
     vc = [vc nextResponder]; 
    } 

    return vc; 
} 

@end 

上面的代碼是Sensible TableView框架的禮貌。你

+2

如果它包含獲取單元格的視圖控制器的代碼,它應該可能將其名稱從* Sensible * – 2014-07-01 13:59:27

0

也可以接入到RootViewController的:

UIViewController *controller = [UIApplication sharedApplication].keyWindow.rootViewController; 
1

對於那些罕見的時候,你想打破MVC ..這是假設您正在使用導航控制器作爲rootVC你的窗口上。更新爲Swift 2

func visibleVC() -> UIViewController? { 
     if let navVC: UINavigationController = UIApplication.sharedApplication().keyWindow?.rootViewController as? UINavigationController { 
      if let vc: UIViewController = navVC.visibleViewController as? MyViewControllerClass { 
       return vc 
      } 
     } 
     return nil 
    } 
+0

更新(Y) – KDeogharkar 2015-12-18 13:19:24

+0

您好@KDeogharkar,您能否標記正確的答案?http://meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work – emdog4 2015-12-21 13:34:26

相關問題