无法隐藏以编程方式创建的 UIButton? [关闭]

Posted

技术标签:

【中文标题】无法隐藏以编程方式创建的 UIButton? [关闭]【英文标题】:Can't hide programmatically created UIButton? [closed] 【发布时间】:2013-04-29 16:42:33 【问题描述】:

LoginController 尝试简单的登录尝试 - 如果成功,它会在 leftcontroller 中调用 setEmail

setEmail 被调用时,我需要做的就是隐藏btnLogin 并显示buttonUser,而我没有尝试任何工作。 NSLogs 被调用,EventsController 加载,所以 setEmail 正在工作 - 它只是不会隐藏和显示按钮。

leftcontroller.h:

@interface LeftController : UIViewController <UIApplicationDelegate>

    IBOutlet UIButton *btnLogin;
    IBOutlet UIButton *buttonUser;
    NSString *setEmail;

@property (nonatomic,strong) IBOutlet UIButton *btnLogin;
@property (nonatomic,strong) IBOutlet UIButton *buttonUser;

@property(nonatomic,strong) UITableView *tableView;
@property(nonatomic) NSString *Email;

//-(void) setEmail : (NSString *) Email;

@end

leftcontroller.m:

- (void) setEmail : (NSString * ) Email
    [buttonUser setTitle:Email forState:UIControlStateNormal];
    //btnLogin.hidden = YES;
    //buttonUser.hidden = NO;
    [btnLogin setHidden:YES];
    [buttonUser setHidden:NO];

    NSLog(@"Set Email Called");
    NSLog(@"email: %@", Email);

    DDMenuController *menuController = (DDMenuController*)((AppDelegate*)[[UIApplication sharedApplication] delegate]).menuController;
    EventsViewController *controller = [[EventsViewController alloc] init];
    UINavigationController *navController = [[UINavigationController alloc] initWithRootViewController:controller];

        [menuController setRootController:navController animated:YES];
 

-(void)viewDidLoad 
    [super viewDidLoad];

    self.view.backgroundColor = HEXCOLOR(0x000000);

    btnLogin = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    btnLogin.frame = CGRectMake(0, 0, 180.f, 48);
    [btnLogin setTitle:@"Login" forState:UIControlStateNormal];
    [btnLogin addTarget:self action:@selector(LoginPressed)
       forControlEvents:UIControlEventTouchUpInside];
    btnLogin.tag=1;

    btnLogin.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    [btnLogin setTitleColor: [UIColor whiteColor] forState:UIControlStateNormal];
    btnLogin.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);

    UIImage *btnImage = [UIImage imageNamed:@"nav_top.png"];
    [btnLogin setBackgroundImage:btnImage forState:UIControlStateNormal];
    [self.view addSubview:btnLogin];

    buttonUser = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    buttonUser.frame = CGRectMake(0, 0, 180.f, 48);
    //[buttonUser setTitle:_Email forState:UIControlStateNormal];
    [buttonUser addTarget:self action:@selector(EmailPressed)
         forControlEvents:UIControlEventTouchUpInside];
    buttonUser.contentHorizontalAlignment = UIControlContentHorizontalAlignmentLeft;
    [buttonUser setTitleColor: [UIColor whiteColor] forState:UIControlStateNormal];
    buttonUser.contentEdgeInsets = UIEdgeInsetsMake(0, 10, 0, 0);

    UIImage *btnImage1 = [UIImage imageNamed:@"nav_top.png"];
    [buttonUser setBackgroundImage:btnImage1 forState:UIControlStateNormal];
    [self.view addSubview:buttonUser];
    buttonUser.hidden = YES;

【问题讨论】:

按钮是您的 XIB 中定义的插座还是代码中的变量或两者兼而有之? 没有 xib - 我认为我不需要 IBOutlet - 只是在尝试不同的东西来让它工作 ***.com/questions/4498400/… 请注意 - 您无需使用任何合理的现代 Xcode 版本为属性声明后备存储变量。此外,拥有一个名为setEmail 的变量是个坏主意。参看。 KVO 【参考方案1】:

这条线是可疑的:

btnLogin = [UIButton buttonWithType:UIButtonTypeRoundedRect];
// ...
[self.view addSubview:btnLogin];

如果您自己在代码中创建btnLogin 并将其添加到self.view,那么为什么它是一个出口?

@property (nonatomic,strong) IBOutlet UIButton *btnLogin;

出口是针对已经存在并在你的nib中实例化的东西。因此,在我看来,您可能有两个 btnLogin 对象,其中一个消除了您对另一个的引用。另一个按钮也是如此。

【讨论】:

【参考方案2】:

设置按钮的hidden 后,您立即说

[menuController setRootController:navController animated:YES]; 

这表明您正在更改界面。但是如果你在改变界面,你真的能分辨出你的按钮是否改变了吗?我不知道你在这里做什么,但也许你的按钮不再出现在界面中。也许您在界面中看到的是一组不同的按钮。

【讨论】:

左控制器(按钮所在的位置)是github.com/devindoty/DDMenuController 的一部分 - 导航栏按钮拉出菜单,单击登录(然后登录)并加载事件控制器 - 左控制器永远不会被卸载 - 它只是隐藏 按钮位于左侧控制器中。如果左控制器隐藏,你怎么知道按钮没有改变?你再也看不到它们了。 想想 facebook ios 应用程序 - 单击导航栏按钮时菜单会拉出 - 所以在我点击登录后,我再次点击导航栏按钮并且登录按钮没有隐藏跨度> 【参考方案3】:

你没有设置你的属性,替换:

btnLogin = [UIButton buttonWithType:UIButtonTypeRoundedRect];

与:

self.btnLogin = [UIButton buttonWithType:UIButtonTypeRoundedRect];

并定义您的属性,例如:

@property (nonatomic,strong) UIButton *btnLogin;

buttonUser 执行相同操作。

【讨论】:

如果按钮是在代码中创建的,为什么要将属性标记为IBOutlet 我的错我的意思是指出它不应该被标记为插座,但忘记删除它,感谢您的关注。

以上是关于无法隐藏以编程方式创建的 UIButton? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

隐藏以编程方式为标签创建的 UIButton

无法在 UITableViewCell 中以编程方式创建的 UIButton 上设置图像

以编程方式创建的 UITextField 隐藏了其他控件

如何以编程方式创建按钮?

以编程方式在UIButton上设置图像和文本

iOS 以编程方式创建的按钮不起作用