从另一个类中检索变量 - 目标C.

时间:2014-04-04 16:34:55

标签: ios objective-c

我正在尝试从班级NSString中的班级PYTimelineViewController中检索rippleMake类型变量。

我在做什么:

rippleMake.m

    /* SET OBJECT */
    PYTimelineViewController *getRippleForVideo = [[PYTimelineViewController alloc] init];
    /* ESTABLISH THE RIPPLE IT VIDEO FOR CHALLENGE VIDEO */
    NSString *videoFor = [getRippleForVideo getchallengeForVideo];
    NSLog(@"%@",videoFor);

运行时,videoFor会返回null

PYTimelineViewController.h

@interface PYTimelineViewController : UITableViewController//<MWPhotoBrowserDelegate>

...
@property (nonatomic, strong) NSString *challengeForVideo;
-(NSString *)getchallengeForVideo;
- (void)setchallengeForVideo:(NSString*)challengeforVideo;
@end

PYTimelineViewController.m

-(IBAction)openRippleIt:(id)sender
{
    CGPoint buttonPosition = [sender convertPoint:CGPointZero toView:self.tableView];
    NSIndexPath *indexPath = [self.tableView indexPathForRowAtPoint:buttonPosition];
    NSInteger rowOfTheCell = (indexPath.row + 1000); // ADD 1000 to get away from effecting other code
    UIButton *button=(UIButton *)[self.view viewWithTag:rowOfTheCell];

    NSString *btnTitle = [button currentTitle];
    [self setchallengeForVideo:btnTitle];
    NSLog(@"%@",[self getchallengeForVideo]); <--- This outputs exactly what I need.
    [self performSegueWithIdentifier:@"moveTorippleIt" sender:self];
}

.m getter和setter:

-(void) setchallengeForVideo:(NSString *)challengeforVideo
{
    _challengeForVideo = challengeforVideo;
}
-(NSString *) getchallengeForVideo
{
    return _challengeForVideo;
}

这很粗糙地将用户推向新的ViewController,但这不应成为问题。

不确定为什么我无法检索该值,因为似乎所有内容都已正确配置。特别是我的吸气剂和制定者。

建议,想法?

3 个答案:

答案 0 :(得分:2)

[[PYTimelineViewController alloc] init]创建一个新的PYTimelineViewController并且不提供现有的。

Some code not executing in a method called from another ViewController

答案 1 :(得分:1)

其他一些评论......

如果您使用的是Xcode&gt; = 4.4,则不需要使用getter和setter。它们由编译器自动创建,以响应@property

惯用语目-C不使用&#34; get&#34;属性上的前缀。

&#34;复印&#34;通常是用于字符串的正确属性属性,因为它们可以是可变的。

您的标题应如下所示:

@interface PYTimelineViewController : UITableViewController
@property (nonatomic, copy) NSString *challengeForVideo;
@end

用法应如下所示:

PYTimelineViewController *vc = [[PYTimelineViewController alloc] init];
[vc setChallengeForVideo:@"some text"];
NSLog(@"%@", [vc challengeForVideo]);

对于奖励积分,请改用点语法:

PYTimelineViewController *vc = [[PYTimelineViewController alloc] init];
vc.challengeForVideo = @"some text";
NSLog(@"%@", vc.challengeForVideo);

答案 2 :(得分:1)

如果要从视图控制器中检索对象,只需将对象发送到您的类即可。

当您在PYTimelineViewController中实例化rippleMake.m时,这一个是全新的,因此您将丢失所需对象的引用。

此外,如果此时唯一的目标是检索var的值,则无需实现getter或setter @property键为您创建getter / setter。

通过在此处添加公共属性将对象传递到您的视图:

// RippleMake.h
// e.g
@property (strong, nonatomic) NSString *foo

在视图控制器中实例化类时,请务必传递属性:

// ViewController.m
// e.g
RippleMake *ripple = ....
ripple.foo = foo;
...

要将对象传递给另一个视图控制器,您必须执行相同的操作,但在prepareForSegue:sender方法中,请参阅以下答案:https://stackoverflow.com/a/22867976/1745596