【问题标题】:Do we always needs to dismissModelViewController that we had presented?我们是否总是需要关闭我们已经呈现的 Model ViewController?
【发布时间】:2011-11-08 13:02:10
【问题描述】:

我已经编辑了整个问题

在以下情况下,呈现 ModelView Controller 和关闭模态视图控制器有什么区别??

  1. 主页视图
  2. TableItemSelection 视图
  3. 拾取器视图

主视图中 我正在viewWillAppear 中编写代码以从从 TableView 设置的 NSUserDefault 中获取值。下面是我的 viewDidLoad 代码(用于初始值)和 viewWillAppear(当来自 tableview 的新值时)

- (void)viewDidLoad
{
    [super viewDidLoad];
    actionMinutes = @"0";
    actionSeconds = @"0";
    restMinutes = @"0";
    restSeconds = @"0";
}

- (void) viewWillAppear:(BOOL)animated
{
    actionMin = [actionMinutes intValue];
    actionSec = [actionSeconds intValue];
    restMin = [restMinutes intValue];
    restSec = [restSeconds intValue];
    NSLog(@"acMin:%d acSec:%d reMin:%d reSec:%d",actionMin,actionSec,restMin,restSec);
}

TableItemSelection 视图中 我从 HomeView 呈现这个视图。现在我想根据 Table 的 didSelectRowAtIndex 方法在 HomeView 中设置 NSString 的值。我正在使用NSUserDefault 来设置值。 通过完成按钮触摸,我正在展示 HomeView。 (实际上我必须dismissModalViewController)但是当我使用dismiss时,我无法在HomeView的NSString中获取值。我从 PickerView 获取表的值。 (我被指示这样做)。下面是我在完成按钮触摸时的表格视图代码

HomeView *homeView = [[HomeView alloc] init];
[homeView.view setBackgroundColor:[UIColor clearColor]];
[homeView.view setFrame:CGRectMake(0 ,40, 320, 460)];
homeView.actionMinutes = [[NSUserDefaults standardUserDefaults] valueForKey:@"actionMinute"];
homeView.actionSeconds = [[NSUserDefaults standardUserDefaults] valueForKey:@"actionSecond"];
homeView.restMinutes = [[NSUserDefaults standardUserDefaults] valueForKey:@"restMinute"];
homeView.restSeconds = [[NSUserDefaults standardUserDefaults] valueForKey:@"restSecond"];
homeView.song = [[NSUserDefaults standardUserDefaults] valueForKey:@"songstring"];
NSLog(@"%@",homeView.actionMinutes);
[self presentModalViewController:homeView animated:YES];

//[self dismissModalViewControllerAnimated:YES];    // if this method is used then no values are passed to HomeView

[homeView release];

PickerView 中 我正在从 pickerview 中获取值,然后将其存储在 UserDefault 中。 下面是我的pickerview代码

NSUserDefaults *actionTime = [NSUserDefaults standardUserDefaults];
[actionTime setValue:min forKey:@"actionMinute"];
[actionTime setValue:sec forKey:@"actionSecond"];

那么为什么我在关闭 ModelView 时无法获得 UserDefault 值。???每次呈现一个新视图会不会产生一堆视图???

【问题讨论】:

  • 如何在 NSUserDefault 中存储数组?可以提供代码吗?
  • 你的数组是否包含自定义对象???
  • 对不起,但更正.. 而不是 NSArray 它的 NSString...
  • 发布如何将值设置为 NSUserDefault 以及如何在另一个控制器中获取它。
  • @Maulik 和 Mayur:我修改了问题

标签: iphone objective-c nsuserdefaults presentmodalviewcontroller dismiss


【解决方案1】:

@DShah:是的,绝对是的..!!

您需要关闭每个模态视图。

另外请发布您正在使用的代码。

还请记住,您需要先放置 NSUserDefaults 行(您使用将 NSString 值分配给 NSUserDefaults 的行),然后将行放在 dismissModalViewControllerAnimated: 中的位置。

如果您需要更多帮助,请给我留言。

希望这对您有所帮助。

【讨论】:

  • 我已经添加了我正在使用的所有代码。但是当我使用dismissModalViewController时,我无法将NSUserDefault值设置为HomeView
  • @DShah:我认为问题是别的。可能是代码执行的顺序,模态视图与NSUserDefaults无关。如果我没记错的话,你可以参考“Hive”中的一种情况。问问你的先生。可能对你有帮助
  • 不,仍然没有......但如果我使用 presentModalViewcontroller.. 那么它工作正常......但仍然没有得到原来的问题......
  • 每次都展示一个新的模态视图控制器并不是一个好的选择。这样一来,您将填写整个堆栈并面临内存问题。
  • 您好 Parth,我仍然无法解决这个问题...我不明白为什么在关闭控制器时我无法保存用户默认值?如果有任何想法,请给我一些提示......
【解决方案2】:

我认为您正在尝试将整数值存储在 NSUserDefaults 中,那么您必须

使用setInteger:forKey: 代替setObject:forKey:。整数不是对象,它是原始类型。

要检索它,请使用integerForKey:

【讨论】:

  • 我已经确认我在双方都使用 NSString 并且我正在使用setValue:forKey:
【解决方案3】:

这是我能够解决问题的最终答案

这是完成按钮触摸事件的代码...

- (IBAction) btnDonePressed:(id)sender {
    aurioTouchAppDelegate *appDelegate = (aurioTouchAppDelegate *) [[UIApplication sharedApplication] delegate];

    appDelegate.homeView.actionMinutes = [[NSUserDefaults standardUserDefaults] valueForKey:@"actionMinute"];
    appDelegate.homeView.actionSeconds = [[NSUserDefaults standardUserDefaults] valueForKey:@"actionSecond"];
    appDelegate.homeView.restMinutes = [[NSUserDefaults standardUserDefaults] valueForKey:@"restMinute"];
    appDelegate.homeView.restSeconds = [[NSUserDefaults standardUserDefaults] valueForKey:@"restSecond"];     
//    [self presentModalViewController:homeView animated:YES];
    [self dismissModalViewControllerAnimated:YES];    // if this method is used then no values are passed to HomeView
}

【讨论】:

  • 请编辑您的问题,而不是添加更多信息作为“答案”。
  • 这是我能够解决问题的最终答案
  • 在这种情况下,您能否解释您做了什么而不是转储大量代码?这将使您的答案更加有用。
  • 实际上我每次都在创建对 HomeView 的新引用。但后来我意识到我需要有与 appDelegate 中相同的 HomeView 引用。所以我只是直接从 appDelegate 使用了相同的 HomeView 引用......
  • 多一点上下文是很好,但这不是绝对需要的。如果你有时间,请考虑扩展一下。
猜你喜欢
  • 2012-08-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多