我只是想将一个简单的字符串从原型单元格中的UILabel转移到下一个View Controller中的标签中。视图控制器的viewDidLoad中label.text的值返回(null)。
- (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;
}
}
我在这里做错了什么?
答案 0 :(得分: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
的方法(viewDidLoad
或viewWillAppear
)中为文本标签指定文本。因此,您需要在viewController中创建一个用于传输NSString
。
答案 1 :(得分: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];
}
更改label.text
之后的presentModalViewController
。现在发生了什么?
- (void)presentViewController:(UIViewController *)viewControllerToPresent animated: (BOOL)flag completion:(void (^)(void))completion
我知道您已经在使用Segue
。你应该按照另一个答案。
答案 2 :(得分: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];
}
}
如果您的segue是从单元格到下一个场景,您也可以使用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];
}
}
有两点需要注意:
作为一种良好的编程风格,我不是从单元格中检索文本值。我正在从模型中检索文本值。您不应该依赖视图来传递信息。回到模型,信息的原始来源。
不要直接在目标控制器中设置text
的{{1}}属性。尚未创建label
的控件。您应该将设置控件推迟到destinationController
的{{1}}。因此,在目标控制器中创建一个destinationController
属性:
viewDidLoad
显然,您应该使用比NSString
更具描述性的名称,但希望您明白这一点。无论如何,@property (nonatomic, strong) NSString *textProperty;
可以设置此新属性,然后目标控制器的textProperty
应该使用该prepareForSegue
属性来填充viewDidLoad
的{{1}}属性,例如:
NSString