Я столкнулся с этой же проблемой сегодня вечером, есть пара обходных путей (включая представление всплывающего окна по старинке).
В этом примере у меня есть объект, который хранится в моем пользовательском классе ячеек. Когда ячейка выбрана, я вызываю подобную функцию, чтобы открыть подробности в popOverViewController об объекте и указать (привязать) к соответствующей ячейке в таблице.
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
CustomViewController* customView = [[self storyboard] instantiateViewControllerWithIdentifier:@"CustomViewController"];
self.myPopOver = [[UIPopoverController alloc]
initWithContentViewController:customView];
self.myPopOver.delegate = self;
//Get the cell from your table that presents the popover
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
[self.myPopOver presentPopoverFromRect:displayFrom
inView:self.view permittedArrowDirections:UIPopoverArrowDirectionLeft animated:YES];
}
Проблема с этим методом заключается в том, что нам часто нужно, чтобы всплывающее окно имело собственный инициализатор. Это проблематично, если вы хотите, чтобы ваше представление было разработано в раскадровке вместо xib и имело собственный метод инициализации, который принимает объект, связанный с вашими ячейками, в качестве параметра для его отображения. Вы также не можете просто использовать всплывающий переход (на первый взгляд), потому что вам нужна динамическая точка привязки (и вы не можете привязываться к прототипу ячейки). Итак, вот что я сделал:
- Во-первых, создайте скрытую кнопку UIButton размером 1px X 1px в представлении контроллеров представления. (важно указать ограничения кнопки, которые позволят перемещать ее в любом месте представления)
- Затем сделайте выход для кнопки (я назвал ее popOverAnchorButton) в вашем контроллере представления и перетащите элемент управления от скрытой кнопки к контроллеру представления, к которому вы хотите перейти. Сделайте это переходом popOver.
Теперь у вас есть всплывающее окно с «легальной» привязкой. Кнопка спрятана, так что никто не сможет ее случайно коснуться. Вы используете это только для точки привязки.
Теперь просто вызовите свой переход вручную в своей функции, как это.
- (void)openCustomPopOverForIndexPath:(NSIndexPath *)indexPath{
//Get the cell from your table that presents the popover
MyCell *myCell = (MyCell*)[self.tableView cellForRowAtIndexPath:indexPath];
//Make the rect you want the popover to point at.
CGRect displayFrom = CGRectMake(myCell.frame.origin.x + myCell.frame.size.width, myCell.center.y + self.tableView.frame.origin.y - self.tableView.contentOffset.y, 1, 1);
//Now move your anchor button to this location (again, make sure you made your constraints allow this)
self.popOverAnchorButton.frame = displayFrom;
[self performSegueWithIdentifier:@"CustomPopoverSegue" sender:myCell];
}
И...... Вуаля. Теперь вы используете магию переходов во всем их величии, и у вас есть динамическая опорная точка, которая, кажется, указывает на вашу ячейку. теперь в -(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender вы можете просто привести отправителя к классу вашей ячейки (при условии, что вы выполняете надлежащие проверки типа отправителя и какой переход вызывается) и передать объекту ячейки targetViewController перехода.
Дайте мне знать, если это поможет, или у кого-нибудь есть какие-либо отзывы или улучшения.
person
johnrechd
schedule
25.01.2013