模态视图重现+崩溃:"正在进行过渡时尝试进行过渡"

4
让我先提供一些背景信息:我正在构建一个选项卡应用程序,允许用户查找和查看托管在我们服务器上的视频。每个选项卡以不同的方式对视频进行分组,导航栏中有一个分段控件,用户可以使用它更加精确地排序列表(按标题、日期等)。点击分段控制中的“排序”后,会呈现一个模态视图控制器,其中包含特定选项卡可用的选项。选择一个选项后,将选择的内容传递回父视图控制器,然后调用服务器以获取已排序的列表。
现在出现了问题:在iOS 4.2上,我们希望支持该版本,模态视图在选择排序选项后要么崩溃,要么在消失后立即再次出现。如果再次出现,则只会出现一次,而不会无限循环。我知道这与过渡和视图的生命周期有关,但我似乎无法做到完美地解决这个问题。
代码如下:
父视图
-(void) segmentAction:(id)sender{
    //create a sort view and pass it a value that indicates what the options should be
    ModalSortViewController *sortView = [[ModalSortViewController alloc]    
                                        initWithNibName:nil bundle:nil sortByView:0];
    [sortView setDelegate:self];
    [sortView setModalTransitionStyle:UIModalTransitionStylePartialCurl];
    [sortView setModalPresentationStyle:UIModalPresentationFormSheet];
    [self presentModalViewController:sortView animated:YES];
}

-(void) refresh:(id)sender{
    [self fetchEntries];
}

//Delegate protocol for all tabbed table views
//Receives buttonIndex from the modal sort view
-(void)sortByButtonIndex:(int)buttonIndex{

    if(buttonIndex==1){
        //If sorting by title
        fetchURL = @"fakeURL.com/?method=iGetCategories&sortBy=category&sortByOrder=ASC";
        [self fetchEntries];
    }
    else if (buttonIndex==2){
        //If sorting by number of items
        fetchURL = @"fakeURL.com/?method=iGetCategories&sortBy=count&sortByOrder=DESC";
        [self fetchEntries];
    }
    else if(buttonIndex==0){
        //Resets sort selection to nothing
        segmentedControl.selectedSegmentIndex = -1;
    }
    [self dismissModalViewControllerAnimated:YES];
}

模态视图

@synthesize delegate, option1, option2;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil sortByView:(int)_viewInt
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
        sortChosen = 0;
        viewInt = _viewInt;
    }
    return self;
}

//This method is called whenever a selection on the modal view has been made.
//The button tags have been set in IB and are sent to the parent table view controller
//where a switch statement is in place to sort its data by the selection.
-(IBAction)madeSelection:(id)sender{
    sortChosen = [sender tag];
    [self.delegate sortByButtonIndex:sortChosen];
}

-(void)viewWillAppear:(BOOL)animated{
    [super viewWillAppear:animated];//Added after Felix pointed out that the super was not called
    switch (viewInt) {
        case CAT_FOLDERS:
            [self.option1 setTitle:@"By Category Name" forState:UIControlStateNormal];
            [self.option2 setTitle:@"By Number of Items" forState:UIControlStateNormal];
            break;

        case PRES_FOLDERS:
            [self.option1 setTitle:@"By Presenter Name" forState:UIControlStateNormal];
            [self.option2 setTitle:@"By Number of Items" forState:UIControlStateNormal];
            break;

        case MEDIA:
            [self.option1 setTitle:@"By Media Title" forState:UIControlStateNormal];
            [self.option2 setTitle:@"By Release Date" forState:UIControlStateNormal];
            break;

        default:
            break;
    }
}

崩溃结果:

*** Terminating app due to uncaught exception 'NSInternalInconsistencyException',
reason: 'Attempting to begin a modal transition from <UINavigationController: 
0x139160> to <ModalSortViewController: 0x172810> while a transition is already in
progress. Wait for viewDidAppear/viewDidDisappear to know the current transition has completed'

很抱歉内容有点长,但我想尽可能地清晰和详尽。先提前感谢您!

编辑提示:需要注意的是,崩溃/重复出现似乎取决于sortByButtonIndex:何时被调用以及何时视图被解散。

2个回答

2

看来我在发布悬赏后几个小时才解决了这个问题!

问题是fetchEntries方法,我没有发布它,因为我认为它不是罪魁祸首,但是当调用服务器完成时,它会将我的分段控件的选定索引设置为-1。似乎较新版本的iOS会忽略EventValueChanged,如果它正在更改为-1。我在segmentAction:方法中设置了一个条件,以忽略分段控件上的-1索引,然后它就可以正常工作了。

-(void) segmentAction:(id)sender{

    if(segmentedControl.selectedIndex != -1){
        //create a sort view and pass it a value that indicates what the options should be
        ModalSortViewController *sortView = [[ModalSortViewController alloc]    
                                        initWithNibName:nil bundle:nil sortByView:0];
        [sortView setDelegate:self];
        [sortView setModalTransitionStyle:UIModalTransitionStylePartialCurl];
        [sortView setModalPresentationStyle:UIModalPresentationFormSheet];
        [self presentModalViewController:sortView animated:YES];
    }

}

感谢您发布解决方案。设置悬赏往往具有心理触发作用,让您更加努力思考并自行找到解决方案,所以不要担心“丢失”的声望:) - MrTJ

1

-(void)viewWillAppear:(BOOL)animated方法内,你没有调用super

尝试在顶部添加以下行:

[super viewWillAppear:animated];

这可能意味着您的ViewController的超级实现没有正确设置其出现标志。

虽然我确实错过了这个问题,但它并没有解决崩溃的问题。 - Squatch
崩溃信息还是一样的吗?你是否正在尝试在一个视图控制器被呈现时解除或呈现另一个视图控制器?你尝试关闭所有动画了吗? - Felix Lamouroux
崩溃信息是相同的。-没有其他被管理的视图会干扰。在排序时重新加载表视图的数据可能是罪魁祸首,但我仍然不知道何时/何处进行排序不会干扰任何动画。-以无动画方式呈现模态视图控制器将导致根本没有显示模态视图。关闭解散动画会导致我需要连续三次精确选择模态视图才能解散视图,并且当它重新出现在屏幕上时,父视图是偏离中心的。非常奇怪的行为。 - Squatch

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接