如何禁用以编程方式添加的Tableview中的按钮

时间:2015-03-05 03:40:20

标签: ios objective-c uitableview

我在表格视图中添加了一些UIButtons。 tableview存在于View中并具有其他按钮。在一个事件中,我试图禁用View中的所有butons,包括在tableview中以编程方式添加的那些。我能够禁用其他按钮,但我无法禁用我添加到表视图的按钮。

结构是这样的:

UITabbarController
|
|---> ViewController01
|*************************|---> View
|************************************|---> tableview
|
|---> ViewController02
**************************|---> View
**************************************|---> tableview

Table View部分占用视图,除了tableView之外,我还有其他UIButtons作为视图的一部分。最初我的视图中没有任何tableviews,视图中只有UIButtons。

我使用以下代码禁用UITabBarController中的所有UIButtons:

-(void) enableAllButtonsInTabBar:(BOOL)enable {
NSMutableArray* viewsArray01 = [NSMutableArray arrayWithArray:self.ViewController01.view.subviews];
NSMutableArray* viewsArray02 = [NSMutableArray arrayWithArray:self.ViewController02.view.subviews];

[viewsArray01 removeObject:self.ViewControlloer01.progressView];
[viewsArray02 removeObject:self.ViewController02.progressView];

for (UIButton* button in viewsArray01) {
    [button setEnabled:enable];
}
for (UIButton* button in viewsArray02) {
    [button setEnabled:enable];
}
}


现在我想实现相同的功能,但我无法访问我在ViewController01和ViewController02中以编程方式添加到表视图中的UIButtons。

虽然我试图使用以下方法隐藏它:

for (UITableView *view in viewsArray02) {
[view setHidden:YES];
}

但这不是我想要的。

3 个答案:

答案 0 :(得分:1)

显然,Tableview单元格在屏幕上不再可见时会被释放。因此,当我尝试访问其他视图控制器(tabbar视图控制器)中的UIButtons时,无法再访问这些按钮。所以结束了这样做。

  • 拥有我自己的NSMutableArray按钮,并在我想要的时候在其他视图控制器中访问它们。

    @interface debugButton : NSObject
    @property NSString * buttonTitle;
    @property BOOL isEnabled;
    
    @end
    
    @implementation debugButton
    @end
    
    @property (strong, nonatomic) NSMutableArray *buttonsArray;
    
    self.buttonsArray = [NSMutableArray array];
    debugButton *button;
    button = [[debugButton alloc] initWithTitle:@"item1" enable:YES];
    button.buttonTitle = @"item2”;
    [self.buttonsArray addObject:button];
    

答案 1 :(得分:0)

试试这个。

您应该将按钮设置为IBOutlet。 在.h:

@property (weak, nonatomic) IBOutlet UIButton *myButton;

在.m:

@synthesize myButton;

[myButton setEnabled:NO];

答案 2 :(得分:0)

鉴于按钮位于UITableViewCells中,表格视图单元格的子视图不包含在表格视图的子视图数组中。

我刚刚创建了一个简单的UITableView,它有一些单元格,里面有一些按钮。在调试器中打印self.view.subviews,我得到以下结果:

<__NSArrayM 0x7b920e50>(
<UITableViewWrapperView: 0x7b933960; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7b933f20>; layer = <CALayer: 0x7b933c60>; contentOffset: {0, 0}; contentSize: {320, 568}>,
<_UITableViewCellSeparatorView: 0x7bd57cf0; frame = (16 307.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4b390>>,
<_UITableViewCellSeparatorView: 0x7bd4a070; frame = (16 351.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4d410>>,
<_UITableViewCellSeparatorView: 0x7bd5ea20; frame = (16 395.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4d7b0>>,
<_UITableViewCellSeparatorView: 0x7bd5c500; frame = (16 439.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4e6e0>>,
<_UITableViewCellSeparatorView: 0x7bd529b0; frame = (16 483.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5b650>>,
<_UITableViewCellSeparatorView: 0x7bd4d350; frame = (16 527.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5d9c0>>,
<_UITableViewCellSeparatorView: 0x7bd5ddd0; frame = (16 571.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5e7c0>>,
<_UITableViewCellSeparatorView: 0x7bd5de90; frame = (16 615.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5bd40>>,
<_UITableViewCellSeparatorView: 0x7bd54ac0; frame = (16 659.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4bf60>>,
<_UITableViewCellSeparatorView: 0x7bd56c40; frame = (16 703.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5d110>>,
<_UITableViewCellSeparatorView: 0x7bd5c6c0; frame = (16 747.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5c740>>,
<_UITableViewCellSeparatorView: 0x7bd5ecc0; frame = (16 791.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5eba0>>,
<_UITableViewCellSeparatorView: 0x7bd56170; frame = (16 835.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5ec00>>,
<_UITableViewCellSeparatorView: 0x7bd561f0; frame = (16 879.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd56270>>,
<UIImageView: 0x7bd52ea0; frame = (317.5 561; 2.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7bd52f20>>,
<UIImageView: 0x7bd52620; frame = (313 565.5; 7 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7bd52940>>
)

正如您所看到的,其中没有任何单元格或内容属于&#39;子视图的一部分。 tableview。

打印出[self.view recursiveDescription]会显示:

<UITableView: 0x7daea400; frame = (0 0; 320 568); clipsToBounds = YES; autoresize = W+H; gestureRecognizers = <NSArray: 0x7b9331f0>; layer = <CALayer: 0x7b932b80>; contentOffset: {0, -64}; contentSize: {320, 264}>
   | <UITableViewWrapperView: 0x7b933960; frame = (0 0; 320 568); gestureRecognizers = <NSArray: 0x7b933f20>; layer = <CALayer: 0x7b933c60>; contentOffset: {0, 0}; contentSize: {320, 568}>
   |    | <UITableViewCell: 0x7bd5df40; frame = (0 220; 320 44); autoresize = W; layer = <CALayer: 0x7bd5dda0>>
   |    |    | <UITableViewCellContentView: 0x7bd5e110; frame = (0 0; 320 43.5); gestureRecognizers = <NSArray: 0x7bd5e320>; layer = <CALayer: 0x7bd5e180>>
   |    |    |    | <UIButton: 0x7bd5e370; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x7bd5e470>>
   |    |    | <_UITableViewCellSeparatorView: 0x7bd5e520; frame = (16 43.5; 304 0.5); layer = <CALayer: 0x7bd5e5a0>>
   |    | <UITableViewCell: 0x7bd5d140; frame = (0 176; 320 44); autoresize = W; layer = <CALayer: 0x7bd4d320>>
   |    |    | <UITableViewCellContentView: 0x7bd5d310; frame = (0 0; 320 43.5); gestureRecognizers = <NSArray: 0x7bd5d520>; layer = <CALayer: 0x7bd5d380>>
   |    |    |    | <UIButton: 0x7bd5d570; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x7bd5d670>>
   |    |    | <_UITableViewCellSeparatorView: 0x7bd5d720; frame = (16 43.5; 304 0.5); layer = <CALayer: 0x7bd5d7a0>>
   |    | <UITableViewCell: 0x7bd5b420; frame = (0 132; 320 44); autoresize = W; layer = <CALayer: 0x7bd52980>>
   |    |    | <UITableViewCellContentView: 0x7bd56300; frame = (0 0; 320 43.5); gestureRecognizers = <NSArray: 0x7bd57ac0>; layer = <CALayer: 0x7bd56370>>
   |    |    |    | <UIButton: 0x7bd55a20; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x7bd57b00>>
   |    |    | <_UITableViewCellSeparatorView: 0x7bd57990; frame = (16 43.5; 304 0.5); layer = <CALayer: 0x7bd57a10>>
   |    | <UITableViewCell: 0x7bd4b980; frame = (0 88; 320 44); autoresize = W; layer = <CALayer: 0x7bd4e540>>
   |    |    | <UITableViewCellContentView: 0x7bd4bb10; frame = (0 0; 320 43.5); gestureRecognizers = <NSArray: 0x7bd56610>; layer = <CALayer: 0x7bd4fec0>>
   |    |    |    | <UIButton: 0x7bd48140; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x7bd253b0>>
   |    |    | <_UITableViewCellSeparatorView: 0x7bd57bf0; frame = (16 43.5; 304 0.5); layer = <CALayer: 0x7bd56f10>>
   |    | <UITableViewCell: 0x7bd5c770; frame = (0 44; 320 44); autoresize = W; layer = <CALayer: 0x7bd5c4d0>>
   |    |    | <UITableViewCellContentView: 0x7bd5cac0; frame = (0 0; 320 43.5); gestureRecognizers = <NSArray: 0x7bd5cdd0>; layer = <CALayer: 0x7bd5cb30>>
   |    |    |    | <UIButton: 0x7bd5ce20; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x7bd5cf20>>
   |    |    | <_UITableViewCellSeparatorView: 0x7bd5d050; frame = (16 43.5; 304 0.5); layer = <CALayer: 0x7bd49da0>>
   |    | <UITableViewCell: 0x7bd55890; frame = (0 0; 320 44); autoresize = W; layer = <CALayer: 0x7bd55bc0>>
   |    |    | <UITableViewCellContentView: 0x7bd56100; frame = (0 0; 320 43.5); gestureRecognizers = <NSArray: 0x7bd56a30>; layer = <CALayer: 0x7bd562d0>>
   |    |    |    | <UIButton: 0x7bd56aa0; frame = (0 0; 0 0); opaque = NO; layer = <CALayer: 0x7bd56ce0>>
   |    |    | <_UITableViewCellSeparatorView: 0x7bd578f0; frame = (16 43.5; 304 0.5); layer = <CALayer: 0x7bd57a90>>
   | <_UITableViewCellSeparatorView: 0x7bd57cf0; frame = (16 307.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4b390>>
   | <_UITableViewCellSeparatorView: 0x7bd4a070; frame = (16 351.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4d410>>
   | <_UITableViewCellSeparatorView: 0x7bd5ea20; frame = (16 395.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4d7b0>>
   | <_UITableViewCellSeparatorView: 0x7bd5c500; frame = (16 439.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4e6e0>>
   | <_UITableViewCellSeparatorView: 0x7bd529b0; frame = (16 483.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5b650>>
   | <_UITableViewCellSeparatorView: 0x7bd4d350; frame = (16 527.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5d9c0>>
   | <_UITableViewCellSeparatorView: 0x7bd5ddd0; frame = (16 571.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5e7c0>>
   | <_UITableViewCellSeparatorView: 0x7bd5de90; frame = (16 615.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5bd40>>
   | <_UITableViewCellSeparatorView: 0x7bd54ac0; frame = (16 659.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd4bf60>>
   | <_UITableViewCellSeparatorView: 0x7bd56c40; frame = (16 703.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5d110>>
   | <_UITableViewCellSeparatorView: 0x7bd5c6c0; frame = (16 747.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5c740>>
   | <_UITableViewCellSeparatorView: 0x7bd5ecc0; frame = (16 791.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5eba0>>
   | <_UITableViewCellSeparatorView: 0x7bd56170; frame = (16 835.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd5ec00>>
   | <_UITableViewCellSeparatorView: 0x7bd561f0; frame = (16 879.5; 304 0.5); autoresize = W; layer = <CALayer: 0x7bd56270>>
   | <UIImageView: 0x7bd52ea0; frame = (317.5 561; 2.5 7); alpha = 0; opaque = NO; autoresize = LM; userInteractionEnabled = NO; layer = <CALayer: 0x7bd52f20>>
   | <UIImageView: 0x7bd52620; frame = (313 565.5; 7 2.5); alpha = 0; opaque = NO; autoresize = TM; userInteractionEnabled = NO; layer = <CALayer: 0x7bd52940>>

最简单的方法是创建一个BOOL属性/实例变量,根据您是否要启用或禁用按钮,设置为YES / NO,以及创建时使用tableView:cellForRowAtIndexPath:方法/自定义单元格,只需将按钮启用状态设置为此变量即可。

每当您希望更改状态时,请更新该变量并致电reloadData,您的单元格也应相应更新。