【问题标题】:Getting the value of a delegate upon clicking back?单击返回时获取委托的价值?
【发布时间】:2013-01-31 02:05:19
【问题描述】:

我有两个类文件。 ViewController 和ChooseServerView。用户单击 ViewController 类中的一个单元格,该单元格将推送到 ChooseServerView。当用户在 ChooseServerView 中进行选择时,该单元格的值将传递给委托。现在,这两个视图位于导航控制器的前面,因此在 ChooseServerView 中有一个后退按钮。当用户单击返回时,我想用委托的新值更新第一个视图中的单元格,有意义吗?

ViewController.h

#import <UIKit/UIKit.h>
#import "ChooseServerView.h"

@interface ViewController : UIViewController <UITableViewDataSource, UITableViewDelegate, serverUserChoice>

{
    NSString *testLocation;
}

@property (nonatomic, retain) NSString *testLocation;

@end

查看控制器.m

#import "ViewController.h"
#import "ChooseServerView.h"
#import "AppDelegate.h"


@interface ViewController ()

@end

@implementation ViewController
@synthesize testLocation;



- (void)viewDidLoad
{


   NSUserDefaults *sharedPref = [NSUserDefaults standardUserDefaults];
   testLocation =[sharedPref stringForKey:@"defaultLocation"];

    NSLog(@"Location Chosen: %@",testLocation);


    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}



#pragma mark - Table View Methods


- (void) userDidChoose:(NSString *) server {

    testLocation = server;
    NSLog(@"Test Location %@", server);

}


- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented
{
    return 2;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different

{

    switch (section) {
        case 0:
            return @"Choose Test Location:";
            break;
        case 1:
             return @"Choose Test Type:";
        default:
            return @"Unknown";
            break;
    }

}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

{
    switch (section) {
        case 0:
            return 1;
            break;
        case 1:
            return 1;
        default:
            return 0;
            break;
    }

}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

{


    UITableViewCell *serverLocCell = [tableView dequeueReusableCellWithIdentifier:@"serverLocation"];



    switch (indexPath.section) {
        case 0:
            serverLocCell.textLabel.text = testLocation;
            serverLocCell.detailTextLabel.text = @"Change";

            break;
        case 1:
            serverLocCell.textLabel.text = @"Speed Test";
            serverLocCell.detailTextLabel.text = @"Change";
            break;
        default:
            break;
    }

    return serverLocCell;

}



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

{
    switch (indexPath.section) {
        case 0:
       [self performSegueWithIdentifier:@"toServerChoice" sender:self];
            break;
        case 1:
           [self performSegueWithIdentifier:@"toTestType" sender:self];
            break;
        default:
            break;
    }

}
@end

选择ServerView.h

#import <UIKit/UIKit.h>

@class ViewController;

@protocol serverUserChoice <NSObject>
@optional

- (void)userDidChoose:(NSString *) server;

@end



@interface ChooseServerView : UIViewController <UITableViewDataSource, UITableViewDelegate, serverUserChoice>

{
    NSArray *serverSelection;
    NSArray *tqServerSelection;
}

@property (nonatomic, retain) NSArray *serverSelection;
@property (nonatomic, retain) NSArray *qServerSelection;
@property (weak, nonatomic) IBOutlet UITableView *tableView;
@property(retain) NSIndexPath* lastIndexPath;
@property (nonatomic, assign) id <serverUserChoice> serverDelegate;

@end

选择服务器视图.m

#import "ChooseServerView.h"
#import "ViewController.h"
#import "AppDelegate.h"

#define totalSections 2
#define standardSection 0
#define qualitySection 1

@interface ChooseServerView ()

@end

@implementation ChooseServerView;
@synthesize serverSelection;
@synthesize qServerSelection;
@synthesize lastIndexPath;
@synthesize serverDelegate;

- (void)viewDidLoad
{

    serverSelection = [[NSArray alloc] initWithObjects:@"Chicgo, IL",@"London, UK",@"San Jose, CA",@"Washington, DC", nil];
    qServerSelection = [[NSArray alloc] initWithObjects:@"Chicgo, IL (Q)",@"London, UK (Q)",@"San Jose, CA (Q)",@"Washington, DC (Q)", nil];
    [super viewDidLoad];

}


#pragma mark - Table View Methods

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView;              // Default is 1 if not implemented
{
    return totalSections;
}

- (NSString *)tableView:(UITableView *)tableView titleForHeaderInSection:(NSInteger)section;    // fixed font style. use custom view (UILabel) if you want something different

{
    switch (section) {
        case standardSection:
            NSLog(@"Std Heading Set");
            return @"Standard Test Locations:";
            break;
        case qualitySection:
            NSLog(@"Qual Heading Set");
            return @"Quality Test Locations:";
            break;
        default:
            NSLog(@"Section Count Error");
           return @"Section Count Error";
            break;
    }


}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;

{
    if (section == 0) {
        NSLog(@"Std Loc Set");
        return [serverSelection count];

    }
    else {
        NSLog(@"Quality Loc Set");
        return [qServerSelection count];

    }
}




- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;

{


    UITableViewCell *serverLoc = [tableView dequeueReusableCellWithIdentifier:@"serverSelection"];



    switch (indexPath.section) {
        case standardSection:
            serverLoc.textLabel.text = [self.serverSelection objectAtIndex:indexPath.row];

            break;
        case qualitySection:
            serverLoc.textLabel.text = [self.qServerSelection objectAtIndex:indexPath.row];
            break;
        default:
            break;
    }


    return serverLoc;

}

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


    NSString *cellvalue;

    UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath];
    cell.accessoryType = UITableViewCellAccessoryCheckmark;
    cellvalue = cell.textLabel.text;
    [serverDelegate userDidChoose:cellvalue];
    NSLog(@"Cell Selected is %@",cellvalue);
    [cell setSelected:FALSE animated:TRUE];


}
@end

我可以看到正确的值被传递给了委托,我只是不知道在使用导航控制器实现的自动后退按钮返回时如何“调用”该委托/方法。

任何想法都会很棒。

根据下面的答案:

添加到我的 ViewController.h

@property (nonatomic, weak) IBOutlet UITableView *tableView;

添加到我的 ViewController.m

-(void) viewWillAppear:(BOOL)animated {

    [super viewWillAppear:animated];
    [self.tableView reloadData];

}

在这个阶段仍然没有快乐。按下导航控制器提供的后退按钮后,第一个单元格无法更新。

【问题讨论】:

    标签: uiviewcontroller ios6 delegates uinavigationcontroller protocols


    【解决方案1】:

    看起来你快到了。

    我认为问题在于您的 UITableView 没有被重新加载以表示 testLocation 的更新值。我没有看到对您的 ViewController 管理的 UITableView 的引用,首先向 ViewController.m 添加一个插座以指向此表视图。

    然后,在 ViewController.m 中添加以下内容

    -(void) viewWillAppear:(BOOL)动画{

    [super viewWillAppear:animated];
    [self.tableView reloadData];
    

    }

    您还需要确保将 ViewController 设置为 ChooseServerViewController 的委托。 (为了清楚起见,您应该将 ChooseServerView.m 重命名为 ChooseServerViewController.m,因为它是一个视图控制器子类——我在下面这样称呼它)

    您可以通过在 ViewController.m 中添加一个 prepare for segue 方法来设置委托 - 类似于:

    • (void) prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender { ChooseServerViewController *viewController = (ChooseServerViewController *)segue.destinationViewController; viewController.serverDelegate = self; }

    我还会考虑将 UITableViewController 用于这两个控制器类,因为这似乎是您正在寻找的功能类型。

    【讨论】:

    • 谢谢乔,我已添加您建议的代码,但无济于事。我的主要帖子已被编辑。谢谢
    • 嗨,Dan,发现另一个问题,您需要设置委托,我更新了我的解决方案并提供了相关说明。
    • 好吧,自从更改文件名后,我现在在 IB 文件中得到了一个 Unknown ChooseServerView 类。我项目中的所有实例都是最新的,并且我还通过构建阶段仔细检查了以确保新名称在那里。它是并且仍然失败。有什么想法吗?
    • 确保将 IB 中的 ViewController 类更新为 ChooseServerViewController。这是在“身份检查器”选项卡下完成的。
    • 实际上我收回了它,我现在已经更新它并且错误已经停止了
    猜你喜欢
    • 1970-01-01
    • 2021-02-22
    • 2018-12-31
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-09
    相关资源
    最近更新 更多