ios - 无法从其他视图控制器访问数据
Posted
技术标签:
【中文标题】ios - 无法从其他视图控制器访问数据【英文标题】:ios - cannot access data from other view controller 【发布时间】:2016-02-29 20:20:14 【问题描述】:这是我第一次编写 Iphoneapp 代码,我很难弄清楚我在这里做错了什么。
我有 2 个视图控制器:viewController 和 viewController2 我从 viewController 调用 viewcontroller2 来设置一些参数并在 viewController 中访问它们。
我为此使用了委托模式,如下所示:
在 viewController2.h 中
#import <UIKit/UIKit.h>
@protocol ViewController2Delegate
-(void)setVideoQual:(NSInteger)quality;
@end
@interface ViewController2 : UIViewController
@property (nonatomic, retain) id delegate;
@property IBOutlet UISegmentedControl *videoQuality;
-(IBAction)handleCloseButton:(id)sender;
-(IBAction)updateVideoQuality:(UISegmentedControl *)sender;
@end
基本上,我想访问我在 viewController 中使用 setVideoQual 函数设置的质量。我使用 UISegmentedControl 设置质量。
在 viewController.m 中
#import "ViewController2.h"
@implementation ViewController2
@synthesize delegate;
-(IBAction)updateVideoQuality:(UISegmentedControl *)sender
NSLog(@"change video quality: %ld", (long)sender.selectedSegmentIndex);
-(IBAction)handleCloseButton:(id)sender
[self.delegate setVideoQual:_videoQuality.selectedSegmentIndex];
[self.navigationController popViewControllerAnimated:YES];
@end
在 viewController.h 我有一个名为 VIDEOQUALITY 的属性,我想将其设置为从 viewController2 导入的质量:
viewController.h
#import <UIKit/UIKit.h>
#import "ViewController2.h"
@interface ViewController : UIViewController
...
NSInteger VIDEOQUALITY;
...
@property (nonatomic,assign) NSInteger VIDEOQUALITY;
@end
然后在 viewController.m 我有:
@implementation ViewController
@synthesize VIDEOQUALITY;
#pragma mark - UI Actions
- (IBAction)actionStart:(id)sender;
...
NSLog(@"NEW VIDEO QUALITY: %d", VIDEOQUALITY);
...
-(void)setVideoQual:(NSInteger)quality
NSLog(@"SETTING VIDEO QUALITY %ld",quality);
VIDEOQUALITY=quality;
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
ViewController2 *ViewController2 = [segue destinationViewController];
ViewController2.delegate = self;
@end
我无法弄清楚为什么当我调用 actionStart 时,VIDEOQUALITY 的值从未设置为调用 setvideoQual 函数时似乎设置的值?
【问题讨论】:
为什么要使用 VIDEOQUALITY 指针?还有为什么都是大写 @RichTolley:是的,我改了,但问题还是一样。调用 setVideoQual 函数,调用 viewDidLoad 函数,就像 VIDEOQUALITY 回到 0 一样。 还有其他方法改变变量吗? 另外,您的代表应该是@property (nonatomic,weak)
而不是retain
。但我不认为这是问题所在。检查它在委托调用中是否不为零
还要检查你是否已经连接了分段控件
【参考方案1】:
为什么将NSInteger* VIDEOQUALITY;
声明为指针?看起来你不需要这个,因为NSInteger
是 primitive 类型并且被定义为无符号int NSUInteger
(例如)。
我想如果您将声明更改为
NSInteger VIDEOQUALITY;
...
@property (nonatomic,assign) NSInteger VIDEOQUALITY;
和实现
-(void)setVideoQual:(NSInteger)quality
NSLog(@"SETTING VIDEO QUALITY %ld",quality);
VIDEOQUALITY=quality;
你会得到想要的行为。
【讨论】:
问题依旧,调用setVideoQual后,调用viewdidload函数后不知道为什么VIDEOQUALITY又回到0了…… @RickyBobby in handleCloseButton: 您调用[self.delegate setVideoQual:_videoQuality.selectedSegmentIndex];
的方法,这就是为什么您在 VIDEOQUALITY 变量中得到 0(如果选择了第一段控制)。你想通过这段代码实现什么?
即使我选择了另一个索引,我仍然得到 0,我不知道为什么。
@RickyBobby 你是否在你的代码中只分配一次VIDEOQUALITY=quality;
(在 setVideoQual: 中)?也许你没有在这里提供类的完整实现并将值分配给其他地方的这个变量。检查是否还有其他地方可以设置 VIDEOQUALITY。
我创建了一个名为 qual2 的新变量,但仍然遇到同样的问题。就像这些变量在某个时间点被隐式设置为 0。以上是关于ios - 无法从其他视图控制器访问数据的主要内容,如果未能解决你的问题,请参考以下文章
无法从 Objective-C 视图控制器访问 Swift var - iOS