从委托类调用视图控制器方法,有问题
Posted
技术标签:
【中文标题】从委托类调用视图控制器方法,有问题【英文标题】:Calling view controller method from delegate class, having issues 【发布时间】:2013-02-22 10:26:01 【问题描述】:我正在从委托类调用视图控制器方法,该方法被调用,但在该方法中声明的 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)。
请指导以上。提前致谢。
【问题讨论】:
所有这些代码都在您的 AppDelegate.m 类中调用? 视图控制器类菜单方法中没有 你的 UIViewController 实现 UITableViewDataSource 和 UITableViewDelegate 了吗? 为什么要在 menu 方法中分配和初始化表视图?您可以尝试在 viewDidLoad 方法中分配和实例化,并在要显示/隐藏时隐藏和显示表格 我正在使用两个表视图,一个在 viewdidload 中,第二个在这个方法中,这将显示在此处声明的 uiview 上。 【参考方案1】:尝试像这样使用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];
【讨论】:
【参考方案2】:不知道你是怎么用的。但我已经检查了一些修改的代码。它工作正常。 您修改后的代码是:
在 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];
截图
【讨论】:
一件事我想问如何隐藏/取消隐藏 btnMenuOpen 按钮。在委托中调用方法时可以隐藏它,但如何取消隐藏它,我的意思是从哪里。 我无法理解你的问题请解释 btnMenuOpen 在被点击时处于委托状态,这个 tableview 就像上面的截图一样打开。该按钮的图像仍在显示,它应该被隐藏,并且在搜索栏之后有一个按钮,单击时隐藏该视图,然后 btnMenuOpen 应该再次取消隐藏,否则我们可以说菜单 btn 应该不在视图后面现在显示在前面。 在viewController UIButton的菜单方法中设置buttonMenuOpen.tag=5 btn=(UIButton)[self.window viewWithTag:5]; btn.hidden=true; 我没明白,请解释一下。以上是关于从委托类调用视图控制器方法,有问题的主要内容,如果未能解决你的问题,请参考以下文章