gpt4 book ai didi

ios - tableView didSelectRowAtIndexPath 在 iOS 7 上不能正常工作。为什么?

转载 作者:可可西里 更新时间:2023-11-01 06:24:49 24 4
gpt4 key购买 nike

首先我想说我只是提出这个问题,因为我想了解正在发生的事情。

我在 Xcode5 的全新安装中打开了一个旧的 Xcode 项目(一个非常简单的项目)。当我意识到它在 iOS 7 上不起作用时。为什么?不知道..

我看到了一些其他问题,没有得到任何有用的答案,所以我做了一个简单的测试。在 UITableViewController 中,除了 didSelectRowAtIndexPath

之外,一切正常

检查一下

RootViewController.h:

@interface RootViewController : UITableViewController

@property (strong, nonatomic) NSMutableArray *items;
@end

RootViewController.m在 viewDidLoad 中,我初始化了数组(带有一些字符串)。

实现 dataSource 和 delegate 方法(是的,我将 delegate 和 dataSource 设置为 tableView)

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
{
return 1;
}
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return [_items count];
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *CellIdentifier = @"Cell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
}

// Configure the cell...
cell.textLabel.text = [_items objectAtIndex:indexPath.row];

return cell;
}

问题出在这里:

    - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here, for example:
// Create the next view controller.
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

// Push the view controller.
[self.navigationController pushViewController:detailViewController animated:NO];

detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}

DetailViewController 是一个简单的 UIViewController:

(是的,我在 nib 文件上设置了 IBOutlet)

@interface DetailViewController : UIViewController
@property (weak, nonatomic) IBOutlet UILabel *detailLabel;

@end

问题是这在 iOS7 上不起作用,DetailViewController 中的标签没有得到更新。我尝试在 pushViewController 之前和之后设置标签文本。

这适用于所有以前版本的 iOS。

为什么不能在 iOS 7 上运行??

我让这个工作的唯一方法是,就像我在 this other question 上看到的那样:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here, for example:
// Create the next view controller.
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

// Push the view controller.
[self.navigationController pushViewController:detailViewController animated:YES];

dispatch_async(dispatch_get_main_queue(), ^{
detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
});
}

有人可以帮助我了解这里发生了什么吗?

谢谢!

_

编辑

它也可以这样工作:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
// Navigation logic may go here, for example:
// Create the next view controller.
DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];

// Push the view controller.
[self.navigationController pushViewController:detailViewController animated:YES];

if (detailViewController.view) {
// do notihing
}
detailViewController.detailLabel.text = [_items objectAtIndex:indexPath.row];
}

最佳答案

当你设置UILabel的值时, View 还没有被加载,所以如果你检查debug,你可能会发现detailLabel是nil。

为什么不在自定义初始化方法中传递值?例如

- (id)initWithDetails:(NSString *)detailsText;

然后在viewDidLoad中,赋值?

根据您的编辑,在回答您关于它为何起作用的问题时:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
TestViewController *test = [[testViewController alloc] init];

NSLog(@"Before: %@", test.label);

if(test.view){}

NSLog(@"After: %@", test.label);

[[test label] setText:@"My Test"];

[self.navigationController pushViewController:test animated:YES];
}

我模拟了您的场景,如果您在 ViewController 上访问“ View ”,如果 View 不存在,它将调用 viewDidLoad。所以你的 UILabel 现在已经设置好了。这是控制台的输出。

2013-10-11 16:21:04.555 test[87625:11303] Before: (null)
2013-10-11 16:21:04.559 test[87625:11303] After: <UILabel: 0x75736b0; frame = (148 157; 42 21); text = 'Label'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x7573740>>

我建议使用自定义初始化方法,而不是这种方法 - 上面的示例是 hack。使用类似这样的东西例如

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
testViewController *test = [[testViewController alloc] initWithText:@"My Test"];

[self.navigationController pushViewController:test animated:YES];
}

如果您不想使用自定义初始化程序,我建议您在 DetailViewController 上使用 NSString 类型的公共(public)属性。在调用 init 后使用您的方法进行分配。然后在 DetailViewController 中,在 viewDidLoad 或 appear 中,将 IBOutlet 设置为包含 NSString 的属性的值。

关于ios - tableView didSelectRowAtIndexPath 在 iOS 7 上不能正常工作。为什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19321228/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com