iOS Segue数据传输的向后兼容性问题

时间:2017-03-18 19:15:52

标签: ios objective-c uiviewcontroller segue compatibility

我发现一些奇怪的问题,但并非所有运行iOS 9.3.5的旧硬件我真的很感激为什么会发生这种情况。我知道我可以解决单身全局问题,但这看起来很难看。

在不好的情况下,通过segue的数据传输不会到达新的视图控制器,而其他旧的硬件运行9.3.5并且所有新的硬件都按预期工作。

简而言之,我有一个使用Master / Detail设计的应用程序,我使用Interface Builder(不是标准模板)构建。主ViewController包含一个UITableView,同时使用STCollapse和MMDrawerSideSlide库。选择表行会生成一个segue,其中prepareForSegue将一些项加载到DetailViewController的属性中。 NSString属性总是正常运行,但是在一些旧硬件中(见下文),所选行的NSIndexPath被正确移动到主VC中prepareForSegue的detail属性中,但是没有到达DetailViewController,属性为NIL时详细信息的viewDidLoad执行。

DetailViewController中的NSIndexPath的硬件和iOS版本的值表

iPad 2       9.3.5   nil
iPad Air     9.3.5   nil
iPad Air2    9.3.5   correct
iPhone 5     9.3.5   nil
iPhone 5s    9.3.5   correct
iPhone 6     9.3.5   correct
all devices  10.x    correct

代码段

主ViewController.m

-(void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    self.selectedIndexPath = indexPath;
    [self performSegueWithIdentifier:@"toDetail" sender:self];
}

- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
{
    // Make sure your segue name in storyboard is the same as this line
    if ([[segue identifier] isEqualToString:@"toDetail"])
    {
        DetailViewController *detailVC = segue.destinationViewController;
        detailVC.selectedIndex = self.selectedIndexPath;
        detailVC.searchName = _theName;
    }
}


DetailViewController.h
@property (nonatomic, weak) NSIndexPath * selectedIndex;
@property (nonatomic, weak)NSString * searchName;



DetailViewController.m

- (void)viewDidLoad {       //In new hardware _selectedIndex is OK, in some old hardware, is nil,  _searchName is always OK!
    [super viewDidLoad];
    Kings *flatkings = [Kings sharedKings];
    self.flatSequenceNumber = (int)[flatkings getFlatIndexFromTablePath:_selectedIndex];
    [self drawTheView];
}

1 个答案:

答案 0 :(得分:0)

selectedIndexsearchName的终身限定符应为copy,而不是weak。两个视图控制器没有理由共享对同一字符串的引用。即使您想要共享引用,也应该使用strong,而不是weak,因为没有潜在的保留周期。

Apple的Advanced Memory Management Programming Guide是一个很好的资源,可以更好地了解终身资格赛。