Search code examples
iosuinavigationcontrolleruibuttonuitableviewuitabbar

How to Enable UI botton in ViewController A upon on row selection in TableViewController B


I have two view controllers (Both Embedded in Navigation Controllers) in tab bar controller. ViewControllerA is has two buttons (MybuttonA and MybuttonB with enabled box unchecked in storyboard). ViewControllerB is a TableViewController. I would like to enable a buttons in ViewControllerA upon selecting specific rows in ViewControllerB table. Each button is expected to push different view controllers when enabled.

My present code works only when ViewControllersA and ViewControllersB are not embedded in Navigation Controllers. But without Navigation controller embedding, the enabled buttons does not push ViewControllers.

ViewControllerA.h

#import <UIKit/UIKit.h>
@interface  ViewControllerA : UIViewController {
IBOutlet UIButton * MybuttonA;
IBOutlet UIButton * MybuttonB;

}
-(IBAction)mybuttonaction:(id)sender;
@property(strong,nonatomic)UIButton *MybuttonA;
 @property(strong,nonatomic)UIButton *MybuttonB;

 @end

ViewControllerA.m

#import "ViewControllerA.h"
@interface ViewControllerA ()
@end

@implementation ViewControllerA
@synthesize MybuttonA;
@synthesize MybuttonB;



- (void)viewDidLoad
{
 [super viewDidLoad];
 // Do any additional setup after loading the view.

 }


-(IBAction)mybuttonaction:(id)sender{
     //write code to push view controller
}

ViewControllerB.h

#import <UIKit/UIKit.h>
#import "ViewControllerA.h"
@interface ViewControllerB : UITableViewController{

ViewControllerA *viewcontrollerA;
}
@property (nonatomic, retain) ViewControllerA *viewcontrollerA;
@end

ViewControllerB.m

#import "ViewControllerB.h"
 #import "ViewControllerA.h"

@interface ViewControllerB () {

}

@end

@implementation ViewControllerB
@synthesize  viewcontrollerA;

- (void)viewDidLoad
{
[super viewDidLoad];

   self.title = @"CONTENTS";

     self.refreshControl = [[UIRefreshControl alloc] init];

  [self.refreshControl addTarget:self action:@selector(reload)        forControlEvents:UIControlEventValueChanged];
 [self reload];
 [self.refreshControl beginRefreshing];

  viewcontrollerA = [self.tabBarController.viewControllers objectAtIndex:0];


 }

#pragma mark - Table View

  - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView
 {return 1;}

 - (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
 {
  {return 5;}
 }

   - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:   (NSIndexPath *)indexPath
 {
 UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell"    forIndexPath:indexPath];
  cell.textLabel.text = [NSString stringWithFormat: @"Cell #%d", indexPath.row];

 }

 return cell;
 }

  - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {

   UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:@"Cell" forIndexPath:indexPath];
NSString* value = [tableView cellForRowAtIndexPath:indexPath].textLabel.text;

   if ([value isEqual:@"1"]){
   viewcontrollerA.MybuttonA.enabled=YES;
   }
   else if ([value isEqual:@"2"])
   {
            viewcontrollerA.MybuttonB.enabled=YES;
   }

    }

  else {
   [tableView deselectRowAtIndexPath:indexPath animated:NO];
   }
   }
  @end

Solution

  • Use this:

    viewcontrollerA = ((UINavigationController*)[self.tabBarController.viewControllers objectAtIndex:0] ).topViewController
    

    Instead of this:

      viewcontrollerA = [self.tabBarController.viewControllers objectAtIndex:0];