2013-01-13 57 views
0

我只是試圖將一個簡單的字符串從原型單元格中的UILabel轉換爲下一個View Controller中的標籤。 ViewController的viewDidLoad中的label.text的值正在返回(null)。從原型單元格傳輸NSString與prepareForSegue不起作用

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath 
{ 
    static NSString *CellIdentifier = @"Cell"; 

    mainCell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; 

    if (mainCell == nil) { 
     mainCell = [[dictionaryTableCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier]; 
    } 

    NSString* date = [dateArray objectAtIndex:indexPath.row]; 
    mainCell.viewLabel.text = date; 

    return mainCell; 
} 


- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"View Segue"]) { 
     NSLog(@"View Load Segue Success"); 

     ViewController *one = segue.destinationViewController; 
     one.label.text = mainCell.viewLabel.text; 
    } 
} 

我在這裏做錯了什麼?

回答

1

您可以使用indexPathForSelectedRow

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"View Segue"]) { 

     ViewController *one = segue.destinationViewController; 

     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 

     one.textProperty = [dateArray objectAtIndex:indexPath.row]; 
    } 
} 

或者你也可以使用sender如果您賽格瑞是從小區到下一個場景,如:

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender 
{ 
    if ([segue.identifier isEqualToString:@"View Segue"]) 
    { 
     ViewController *one = segue.destinationViewController; 

     NSAssert([sender isKindOfClass:[UITableViewCell class]], @"Not cell"); 

     UITableViewCell *cell = sender; 
     NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; 

     one.textProperty = [dateArray objectAtIndex:indexPath.row]; 
    } 
} 

有兩點需要注意:

  1. 作爲一種良好的編程風格,我沒有檢索文本VA從細胞中出來。我正在從模型中檢索文本值。你不應該依靠信息傳遞的觀點。回到模型上,信息的原始來源。

  2. 請勿直接在目標控制器中設置labeltext屬性。尚未創建destinationController的控件。您應該推遲設置控件,直到destinationControllerviewDidLoad。所以,相反,在目標控制器創建NSString屬性:

    @property (nonatomic, strong) NSString *textProperty; 
    

    顯然,你應該使用一個更具描述性的名稱比textProperty,但希望你的想法。總之,prepareForSegue可以設置這個新屬性,然後將目標控制器的viewDidLoad應使用NSString屬性來填充UILabeltext屬性,如:

    - (void)viewDidLoad 
    { 
        [super viewDidLoad]; 
    
        self.label.text = self.textProperty; 
    } 
    
+0

具有邏輯意義。我嘗試了第一種方式,但我得到第一個錯誤,雖然問我是否意思是segue.destinationViewController,然後得到下一個錯誤後,說「沒有已知的實例方法選擇器'setTextProperty:'@Rob – Zack

+0

當我試圖編譯和運行模擬器出現了Build Failed並給了我那個錯誤 – Zack

+0

@Zack假設'ViewController'是你的目標控制器的類名,你可以使用它,見我更新的答案(順便說一句,'ViewController'是一個好奇的名字爲目標控制器,這通常是標準Xcode項目中的第一個視圖控制器的名稱,通常不是segues的目標。) – Rob

1
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath  { 
    YourViewController *controller =[[YourViewController alloc] init]; 
    [self presentModalViewController:controller animated:YES]; 
    one.label.text = [dateArray objectAtIndex:indexPath.row]; 
} 

變化presentModalViewControllerlabel.text。現在會發生什麼?

- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion 

我知道您已經在使用Segue。你應該遵循另一個答案。

+0

dateArray具有雖然如貓,狗多個對象。不只是一個。這顯然會拉動集合中的第一個(貓),但如果我選擇文本中的值(狗)的單元格,它仍然會返回貓。由於某種原因,one.label.text仍然返回null – Zack

+0

仍然返回null。 「/我不知道爲什麼,你希望我分配正確的didSelectRowAtIndexPath中的視圖控制器? – Zack

+0

presentModalViewController:已被棄用 – Zack

2
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { 

    if ([segue.identifier isEqualToString:@"View Segue"]) { 
     NSLog(@"View Load Segue Success"); 
     NSIndexPath *indexPath = [self.tableView indexPathForSelectedRow]; 
     ViewController *one = segue.destinationViewController; 
     one.label.text = [dateArray objectAtIndex:indexPath.row]; 
    } 
} 

而實際上,文本標籤,你應該在你的viewController one的方法(viewDidLoadviewWillAppear)做分配文本。所以,你需要在viewController中創建一個用於傳輸NSString的屬性。

+0

'indexPathForSelectedRow'太棒了! –

+0

@Flink好吧,所以我嘗試了你在上面做了什麼,它仍然無法正常工作。不過,我仍然試圖理解第二部分的含義。你介意給我一個我應該做什麼的例子嗎? – Zack

+0

@Zack檢查這個http://www.raywenderlich.com/5138/beginning-storyboards-in-ios-5-part-1。 – Shmidt

相關問題