Вызов didSelectRowAtIndexPath из другого ViewController не отвечает iPad - PullRequest
4 голосов
/ 21 января 2012

Я хочу изменить выбранную строку в таблице (в MasterViewController) с помощью кнопки на detailViewController.Я знаю, что не могу вызвать didSelectRowAtIndexPath, потому что это метод делегата.Я попытался использовать selectRowAtIndexPath, но это не вызывает ни didSelectRowAtIndexPath, ни willSelectRowAtIndexPath метод.Как показано здесь, https://stackoverflow.com/a/7496926/1050722 можно использовать какой-то новый метод и затем вызывать этот метод из другого ViewController (detailViewController), но как этот метод должен выглядеть?

Вот некоторый код:

MasterViewController.m

- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath   
{
    [self pushDetailViewController:indexPath];
}

-(void)pushDetailViewController:(NSIndexPath *)indexPath
{        
    if (!self.detailViewController) {
        self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    }
    [self.navigationController pushViewController:self.detailViewController animated:YES];
    NSLog(@"pushDetailviewC and index %@", indexPath);
}

DetailViewController.m

-(IBAction)nextItem
{
    MasterViewController *mVc = [[MasterViewController alloc] init];
    [mVc pushDetailViewController:[NSIndexPath indexPathForRow:0 inSection:0]];
}

Может кто-нибудь дать мне примерпочини это?Спасибо.

РЕДАКТИРОВАНИЕ : вот новый код

MasterViewController.m

   - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
    [self pushDetailViewController:indexPath];

}

-(void)pushDetailViewController:(NSIndexPath *)indexPath{

    if (!self.detailViewController) {
        self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
    }
    self.detailViewController.mVc = self;
    [self.navigationController pushViewController:self.detailViewController animated:YES];
    NSLog(@"pushDetailviewC and index %@", indexPath);
}

DetailViewController.h

#import <UIKit/UIKit.h>
#import "MasterViewController.h"

@interface DetailViewController : UIViewController <UISplitViewControllerDelegate, UITableViewDelegate>

@property (strong, nonatomic) id detailItem;
@property (strong, nonatomic) IBOutlet UILabel *detailDescriptionLabel;
@property (nonatomic, retain) MasterViewController *mVc;

DetailViewCOntroller.m

-(IBAction)test{
    //MasterViewController *mVc = [[MasterViewController alloc] init];
    [self.mVc pushDetailViewController:[NSIndexPath indexPathForRow:0 inSection:0]];
}

Он не вызывает часть метода NSLog и не выбирает строку ...

Ответы [ 2 ]

12 голосов
/ 21 января 2012

Этот ответ зависит от вашего iPad.

Версия iPad шаблона Master / Detail использует UISplitViewController два разделенных экрана, как вы видите. Этот экземпляр UISplitViewController содержит ссылки на оба ваших контроллера навигации. Которые хранят ссылки на ваши самые верхние контроллеры представления. Вот пример кода, не используйте его дословно, кроме как для проверки, поскольку он не содержит проверки ошибок .

// Picking some arbitrary row 
NSUInteger desiredRow = 3;//???
// The Master navigation controller is at index zero in the template, you can check in your app delegate's didFinishLaunching: method
UINavigationController *masterController = [self.splitViewController.viewControllers objectAtIndex:0];
// Next we want a reference to the topmost viewController again you shouldn't assume it's a UITableViewController
UITableViewController *tableController = (UITableViewController *)masterController.visibleViewController;
// Next we get the reference to the tableview in-question
UITableView *tableView = tableController.tableView;
// We translate our desired row to an index path
NSIndexPath *path = [NSIndexPath indexPathForRow:desiredRow inSection:0];
// We select the row , again this will not call didSelectRowAtIndexPath:
[tableView selectRowAtIndexPath:path animated:YES scrollPosition:UITableViewScrollPositionNone];
// We call didSelectRowAtIndexPath: on the tableview's delegate
[tableView.delegate tableView:tableView didSelectRowAtIndexPath:path];

Когда я помещаю этот код в метод IBAction в контроллере подробного представления, связанная кнопка выполняет соответствующие действия, выбирает строку и нажимает ВК, как если бы я выбрал строку касанием.

3 голосов
/ 21 января 2012

В DetailViewController.h добавить свойство к объекту, которое указывает на MasterViewController.Вам также необходимо импортировать MasterViewController.h, например,

# import "MasterViewController"

...

@ property (nonatomic, retain) MasterViewController * mVc;

...

Не забудьте в DetailViewController.m до @synthesize mVc;

Теперь в вашем pushDetailViewController вы добавляете ссылку для объединения двух объектов

if (!self.detailViewController) {
    self.detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
}
[self.detailViewController.mVc = self]; // New line
[self.navigationController pushViewController:self.detailViewController animated:YES];

Затем в DetailViewController вы ссылаетесь на объект

-(IBAction)nextItem{
[self.mVc pushDetailViewController:[NSIndexPath indexPathForRow:0 inSection:0]];
}  

Я думаю, что другой проблемой, с которой вы сталкивались, было выделение новой версии mVC каждый раз, когда вы нажимаете кнопку nextItem.IOS с радостью позволит вам создавать множество объектов MasterViewController и будет создавать новый каждый раз, когда вы alloc его.Вы просто хотели получить дескриптор вашего оригинального MasterViewController.
Другой подход - изучить использование parent методов для ссылки на MasterViewController.Но я хотел показать вам, как сделать это с явным свойством, так как думал, что это будет понятнее.

Кроме того, это может решить, а может и не решить все ваши проблемы, но, надеюсь, по крайней мере покажет вам, как общаться с настоящим MasterViewController.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...