如何根据表视图中重新加载的数据启用/禁用UIBarButton?

时间:2014-12-29 09:44:40

标签: ios iphone uitableview

我正在开发文件管理器应用程序,我在表格视图中列出所有目录。在根据用户选择的内容进行选择时,我正在重新加载表视图的内容。 (例如,用户将显示目录列表当他点击时可以说音乐目录我将加载音乐目录中的所有目录。

现在我真正需要做的是我在顶部有后退按钮但我希望当用户不在根目录中时启用它。我应该在哪里放置代码?

编辑:

我的代码在

下面
#import "ViewController.h"
#import "AddDirectory.h"
@interface ViewController ()
@property NSArray *fileList;
@property NSFileManager *manager;
@property (weak, nonatomic) IBOutlet UITableView *tableView1;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *bkbutton;
@property NSMutableString *currentDir;
@property NSString *rootpath;
@end

@implementation ViewController
- (void)viewWillAppear:(BOOL)animated{

[self.tableView1 reloadData];
}
- (void)viewDidLoad {
[super viewDidLoad];
self.manager=[NSFileManager defaultManager];
NSArray *paths=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory=[paths objectAtIndex:0];
self.fileList=[self.manager contentsOfDirectoryAtPath:documentDirectory error:nil];
self.currentDir=[[NSMutableString alloc] init];
[self.currentDir appendString:documentDirectory];
self.rootpath= self.currentDir;
//NSLog(@"%@",self.fileList);
// self.fileList=contents;

// Do any additional setup after loading the view, typically from a nib.
}
-(NSInteger)numberOfSectionsInTableView:(UITableView *)tableView{
return 1;
}
- (IBAction)backDirectory:(id)sender {
self.currentDir = [NSMutableString stringWithFormat:@"%@", [self.currentDir stringByDeletingLastPathComponent]];
self.fileList = [self.manager contentsOfDirectoryAtPath:self.currentDir error:nil];
[self.tableView1 reloadData];
}

-(NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
// NSLog(@"%i",[self.fileList count]);
return [self.fileList count];
}
-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath  {
UITableViewCell *cell=[tableView dequeueReusableCellWithIdentifier:@"cell1"];
NSString *cfname=[self.fileList  objectAtIndex:[indexPath row]];
//    NSString *fname=[[cfname lastPathComponent] stringByDeletingPathExtension];
    NSString *fname=[cfname lastPathComponent];
// NSLog(@"%@",fname);
cell.textLabel.text=fname;

return cell;
}
- (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
if([segue.identifier isEqualToString:@"adddir"]){
    AddDirectory *ad=segue.destinationViewController;
    ad.cpath=self.currentDir;

}
}

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

if(self.currentDir!=nil){
    [self.currentDir appendString:[NSString stringWithFormat:@"/%@",[self.fileList objectAtIndex:indexPath.row]]];
    self.fileList=[self.manager contentsOfDirectoryAtPath:self.currentDir error:nil];
    NSLog(@"%@",self.currentDir);
    [tableView reloadData];

}
if([self.currentDir isEqualToString:self.rootpath]){
    self.navigationItem.leftBarButtonItem.enabled = NO;
}
}

3 个答案:

答案 0 :(得分:1)

所以这是解决您问题的方法。 让我们假设您有一个带可见导航控制器的视图控制器&你在根目录。在BOOL isRoot中创建类中的iVar。最初将它设置为True。

@property(nonatomic) BOOL isRoot;

现在编写自定义setter。

-(void)setIsRoot:(BOOL)isRoot{
    _isRoot = isRoot;
    self.navigationItem.hidesBackButton = !isRoot;
}

现在根据您挖掘子目录或层次结构的逻辑,只需更新此isRoot值。

您还可以按照NSNotificationCenter方法发送通知,以便在每次玩具重新加载您的桌面时调用此方法。

希望有所帮助。

答案 1 :(得分:0)

根类中的一行解决方案(在viewDidLoad中)写下这一行:

self.navigationItem.leftBarButtonItem.enabled = NO;

并参考这个问题 same question here

答案 2 :(得分:0)

您可以这样做:

  1. 将TableViewController设置为导航控制器的根视图控制器
  2. 将NavigationController设置为您应用的根视图控制器。
  3. 然后你只需按下你在导航控制器中查看的内容,当你在root中时,后退按钮会自动隐藏。

    <强>编程:

    如果您知道自己是root用户,请执行此操作;

    -(void)viewWillAppear:(BOOL)animated {
        self.navigationItem.hidesBackButton = YES;
    }
    

    修改

    拿一个NSMutableArray。在你的ViewDidLoad推@“Root”中,就像你在root中一样。并添加:

    UIBarButtonItem *backBarButton = [[UIBarButtonItem alloc] initWithImage:[UIImage imageNamed:@"Back"] style:UIBarButtonItemStylePlain target:self action:@selector(goBack:)];
    self.navigationItem.leftBarButtonItem = backBarButton;
    self.navigationItem.leftBarButtonItem.enabled = NO;
    

    在你didSelectRowAtIndexPath

    NSMutableArray推送你去的地方。并检查MutableArray.count是否&gt; 1然后self.navigationItem.leftBarButtonItem.enabled = YES;

    你的goBack方法中的

    执行此操作:

    - (void) goBack:(id)sender {
        //pop last item form NSMutableArray
        //Check array count if it is still > 1 keep the leftButton enabled 
        // if count is ==1 disable the left button
    }
    

    希望这会有所帮助.. :)