Вызов метода контроллера представления из класса делегата, возникают проблемы

Я вызываю метод контроллера представления из класса делегата, метод вызывается, но uitableview, объявленный в этом методе, не вызывает его методы делегирования, а кнопки и представление также размещаются в этом представлении, но ничего не отображается.

Объяснение с самого начала:

На навигационном контроллере нужна кнопка, которая будет отображаться на всех представлениях. Итак, я взял это делегатом таким образом.

UIButton *btnMenuOpen = [UIButton buttonWithType:UIButtonTypeCustom];
btnMenuOpen.frame = CGRectMake(0, 15, 40, 56);
[btnMenuOpen setImage:[UIImage imageNamed:@"side_menu.png"] forState:UIControlStateNormal];
[btnMenuOpen addTarget:self action:@selector(menu) forControlEvents:UIControlEventTouchUpInside];
[self.window addSubview:btnMenuOpen];

-(void)menu
{
ViewController *viewC = [[ViewController alloc]initWithNibName:@"ViewController" bundle:nil];
[viewC menu];
}

Это класс контроллера представления:

-(void)menu
{
NSLog(@"menu opened");

self.mMenuView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 240, 480)];
self.mMenuView.backgroundColor = [UIColor grayColor];
self.mMenuView.autoresizingMask = 0;
[self.navigationController.view addSubview:self.mMenuView];

self.mSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 16, 220, 44)];
self.mSearchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
self.mSearchBar.backgroundImage = [UIImage imageNamed:@"slide_tab_button.png"];
self.mSearchBar.delegate = self;
[self.mMenuView addSubview:self.mSearchBar];

UIButton *btnMenuClose = [UIButton buttonWithType:UIButtonTypeCustom];
btnMenuClose.frame = CGRectMake(215, 19, 40, 44);
[btnMenuClose setImage:[UIImage imageNamed:@"side_menu.png"] forState:UIControlStateNormal];
[btnMenuClose addTarget:self action:@selector(menu_close) forControlEvents:UIControlEventTouchUpInside];
[self.mMenuView addSubview:btnMenuClose];

self.mMenuTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 61,
                                                                   240, 420) style:UITableViewStylePlain];
self.mMenuTableView.delegate = self;
self.mMenuTableView.dataSource = self;
[self.mMenuView addSubview:self.mMenuTableView];

[self.mMenuTableView reloadData];

}

Теперь при вызове этого метода ничего не отображается, управление проходит через него, но ничего не происходит, никакие делегаты таблицы не вызываются, и никакие другие вещи не работают (кнопка поиска и uiview).

Пожалуйста, руководство для выше. Заранее спасибо.


person iPhone Programmatically    schedule 22.02.2013    source источник
comment
весь этот код вызывается в вашем классе AppDelegate.m?   -  person Andrea Mario Lufino    schedule 22.02.2013
comment
Нет метода меню класса контроллера представления   -  person iPhone Programmatically    schedule 22.02.2013
comment
Ваш UIViewController реализует UITableViewDataSource и UITableViewDelegate?   -  person Andrea Mario Lufino    schedule 22.02.2013
comment
Почему вы выделяете и инициализируете представление таблицы в методе меню? Вы можете попытаться выделить и экземпляр в своем методе viewDidLoad и скрыть и показать таблицу, когда вы хотите показать/скрыть   -  person Andrea Mario Lufino    schedule 22.02.2013
comment
Я использую два табличных представления, одно находится в viewdidload, а второе в этом методе будет показано в uiview, объявленном здесь.   -  person iPhone Programmatically    schedule 22.02.2013


Ответы (2)


Попробуйте использовать NSNotificationCenter вот так

Зарегистрируйте уведомление в своем ViewController.m

- (void)viewDidLoad
{
    [[NSNotificationCenter defaultCenter] addObserver: self
                                             selector: @selector(menu)
                                                 name: @"myMenuNotification"
                                               object: nil];
}

И в вашем AppDelegate.m вызовите этот метод, используя уведомление, например

-(void)menu
{
    [[NSNotificationCenter defaultCenter] postNotificationName:@"myMenuNotification" object:nil];
}
person βhargavḯ    schedule 22.02.2013

Я не знаю, как вы используете. Но я проверил код с некоторыми изменениями. он работает нормально. Ваш модифицированный код:

В методе AppDelegate.

    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    self.window = [[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]];
    // Override point for customization after application launch.
    self.viewController = [[sampleViewController alloc] initWithNibName:@"sampleViewController" bundle:nil];
    self.navController=[[UINavigationController alloc] initWithRootViewController:self.viewController];

    self.window.rootViewController = self.navController;
    [self.window makeKeyAndVisible];

    UIButton *btnMenuOpen = [UIButton buttonWithType:UIButtonTypeCustom];
    btnMenuOpen.frame = CGRectMake(0, 15, 40, 56);
    [btnMenuOpen setImage:[UIImage imageNamed:@"5.jpg"] forState:UIControlStateNormal];
    [btnMenuOpen addTarget:self action:@selector(menu) forControlEvents:UIControlEventTouchUpInside];
    [self.window addSubview:btnMenuOpen];

    [self menu];
    return YES;
}

-(void)menu
{
    [self.viewController menu];
}

//В представлении контроллера............

    -(void)menu
{
    NSLog(@"menu opened");

    UIView *mMenuView;
    UISearchBar *mSearchBar;
    UITableView *mMenuTableView;

    mMenuView = [[UIView alloc]initWithFrame:CGRectMake(0, 0, 240, 480)];
    mMenuView.backgroundColor = [UIColor grayColor];
    mMenuView.autoresizingMask = 0;
    [self.navigationController.view addSubview:mMenuView];

    mSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0, 16, 220, 44)];
    mSearchBar.autoresizingMask = UIViewAutoresizingFlexibleWidth;
    mSearchBar.backgroundImage = [UIImage imageNamed:@"5.jpg"];
//    mSearchBar.delegate = self;
    [mMenuView addSubview:mSearchBar];

    UIButton *btnMenuClose = [UIButton buttonWithType:UIButtonTypeCustom];
    btnMenuClose.frame = CGRectMake(215, 19, 40, 44);
    [btnMenuClose setImage:[UIImage imageNamed:@"side_menu.png"] forState:UIControlStateNormal];
    [btnMenuClose addTarget:self action:@selector(menu_close) forControlEvents:UIControlEventTouchUpInside];
    [mMenuView addSubview:btnMenuClose];

    mMenuTableView = [[UITableView alloc]initWithFrame:CGRectMake(0, 61, 240, 420) style:UITableViewStylePlain];
//    mMenuTableView.delegate = self;
//    mMenuTableView.dataSource = self;
    [mMenuTableView setBackgroundColor:[UIColor blueColor]];
    [mMenuView addSubview:mMenuTableView];

    [mMenuTableView reloadData];
}

Снимок экрана Снимок экрана вашего приложения

person Warewolf    schedule 22.02.2013
comment
Одна вещь, которую я хочу спросить, как скрыть/показать кнопку btnMenuOpen. Его можно скрыть, когда метод вызывается в делегате, но как его отобразить, я имею в виду, откуда. - person iPhone Programmatically; 22.02.2013
comment
Я не могу понять ваш вопрос, пожалуйста, объясните - person Warewolf; 22.02.2013
comment
btnMenuOpen находится в делегате, когда по нему щелкают, это табличное представление открывается, как на снимке экрана выше. Изображение этой кнопки все еще отображается, оно должно быть скрыто, и сразу после панели поиска есть кнопка, которая скрывает это представление при нажатии, а затем btnMenuOpen снова должно отображаться, иначе мы можем сказать, что кнопка меню должна быть за видом, а не спереди, как сейчас видно. - person iPhone Programmatically; 22.02.2013
comment
установить buttonMenuOpen.tag=5 в методе меню в viewController UIButton btn=(UIButton)[self.window viewWithTag:5]; btn.hidden=истина; - person Warewolf; 22.02.2013
comment
я не понял, объясните. - person iPhone Programmatically; 22.02.2013
comment
self.window не разрешен в контроллере представления, я пробовал с self.view, тогда это не сработало. - person iPhone Programmatically; 22.02.2013
comment
UIButton btn=(UIButton)[self.view viewWithTag:5]; btn.hidden=ЛОЖЬ; - person iPhone Programmatically; 22.02.2013
comment
btnMenuOpen находится в делегате, а не в контроллере представления. - person iPhone Programmatically; 22.02.2013
comment
self.view.window понял? Или нужно объяснить больше. - person Warewolf; 22.02.2013