How do I reference the detailViewController on an iPad that is using a splitViewController

元气小坏坏 提交于 2020-01-11 12:23:06

问题


I setup a project on XCode 4.3 and IOS 5 without using storyboards for both iPhone and iPad using the default Master/Detail setup from the create new project dialog.

The iPhone side works just fine. I select an option in the tableView and the detailViewController screen updates with the new information based on the selection.

My implementation of didSelectRowAtIndexPath is:

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {  
        Shapes *currentShape = [self.shapesArray objectAtIndex:indexPath.row];  
        if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {  
            if (!self.detailViewController) {  
                self.detailViewController = [[[GeoDetailViewController alloc] initWithNibName:@"GeoDetailViewController_iPhone" bundle:nil] autorelease];  
            }  
            [self.navigationController pushViewController:self.detailViewController animated:YES];  
            [self.detailViewController populateDisplay:currentShape];  
        } else {  
            [self.detailViewController populateDisplay:currentShape];  
        }  
}  

However, when I run on the iPad, self.detailViewController does not exist. so the display doesn't update. I can still see it on the iPad screen, I just can't change anything on it. How do I reference it in the code so I can make changes to what is displayed?


回答1:


I was puzzled by the templates implementation of the Master/Detail view. I asked a similar question:

How to update DetailView using MasterDetail Application Template

You can use the detailItem (id - so you can pass in a reference) property that is set up by default for the DetailViewController class.




回答2:


If you have a pointer to the split view controller itself, you can do:

[(GeoDetailViewController *)[[(UINavigationController *)[[splitViewController viewControllers] objectAtIndex:1] viewControllers] objectAtIndex:0] populateDisplay:currentShape];

To get the pointer to your split view, you will probably have to go via your app delegate:

UISplitViewController *splitViewController = [(MyAppDelegate *)[[UIApplication sharedApplication] delegate] splitViewController];

(assuming that you are using the default split view controller template - YMMV depending on how you have implemented it)

Note that when you create your split view, you must set the detail view controller to be a GeoDetailViewController - if you are not and you cannot for app design reasons, I can edit my answer to work around that.




回答3:


In the master/detail template, Apple uses the following code in the MasterViewController (i.e. the one on the left):

- (void)viewDidLoad {
    [super viewDidLoad];
    self.detailViewController = (MYDetailViewController *)[[self.splitViewController.viewControllers lastObject] topViewController];
}

With the property on MasterViewController defined as:

@property (strong, nonatomic) MYDetailViewController *detailViewController;


来源:https://stackoverflow.com/questions/9134275/how-do-i-reference-the-detailviewcontroller-on-an-ipad-that-is-using-a-splitview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!