【问题标题】:Objective C: Methods Can't See One Another?目标 C:方法不能互相看到?
【发布时间】:2013-12-16 04:22:35
【问题描述】:

我是 Objective-C 的新手,所以请耐心等待。我不是在寻找代码讲义,但希望能提供一些关于在哪里寻找答案的指导。

我是一名电影编辑器,我用 Python 制作了一个小型实用程序的原型,它读取编辑决策列表(这是一个带有时间码和与视频编辑相关的各种其他信息的文本块)并在一行中解析文件一个时间并提取某些信息来创建一个字幕列表。

一旦我让它在 Python 中工作,我就做出了将代码迁移到 Objective-C 的大胆决定,这样我就可以将我的实用程序作为二进制可执行文件分发给其他编辑器。

背景故事讲了这么多,现在来回答问题……

昨晚我设法构建了 GUI,这是一个简单的按钮来启动文件请求器(加载文本文件)一个按钮来转换文件,以及一个按钮来保存新转换的文件。还有一个文本视图对象来显示转换后的文件。我设法将所有小部件附加到新类,并且可以测试每个被单击的按钮,并且可以手动将文本写入文本视图小部件。到目前为止,一切都很好。

我遇到的问题是弄清楚如何将信息从一种方法传递到另一种方法。特别是,如果我使用 openFile 方法打开文件,那么如何将该信息传递给 convertFile 方法?当我尝试时,我收到一条消息,告诉我我的 openFile 未定义。我认为这都是关于数据封装的。但这真是令人沮丧,而且我是一个新手,我什至不确定我应该寻找什么答案。在 Python 中这很容易:给定类中的任何方法似乎都可以毫无问题地无缝转移到任何其他方法。

回顾一下,我确实打开了文件请求器,并且能够读取文件。我什至可以逐行解析它。但它在它自己的方法中,我终其一生都无法弄清楚如何将这些信息传递给“convert”方法,然后如何将转换后的文件传递给“save”方法。

非常感谢您的指导。提前致谢。

克里斯·康利

【问题讨论】:

  • 你所说的“传递信息”是什么意思?在 OOP 中进行信息传递有很多不同的方法,我相信您知道来自 Python。也许您的意思是调用方法或实例化类以供以后使用?
  • 感谢您与我们联系。具体来说,我调用了一个打开文件请求程序并简单地收集路径和文件名的方法。然后,用户可以单击调用新方法的“转换文件”按钮,在该方法中,我只想能够从早期方法中调用路径和文件名,以便我可以打开文件并解析它。我现在正在阅读@property 声明,我认为这是我需要的线索。

标签: objective-c methods function-pointers encapsulation


【解决方案1】:

ObjC 在这方面与 Python 并没有什么不同。在这两种语言中,数据都可以与对象、函数/方法的本地或全局相关联。您可以将数据作为参数直接从一种方法传递给另一种方法,也可以通过将数据存储在两种方法都可以访问的位置(例如,实例变量)间接传递。

对于前者,你会做这样的事情(假设实现填充,因为我不知道你的方法做什么):

@implementation MyClass //in the .m
- (void) openFile:(NSString *)pathToFile {
    NSData *fileData = [NSData dataWithContentsOfFile:pathToFile];
    [self convertFile:fileData];
}

- (void) convertFile:(NSData *)fileData {
    //whatever you wanted to do to fileData
}
@end

对于后者,您需要在对象上声明要存储的内容的存储空间,以及应该如何访问该存储空间。现代 ObjC 将这些任务与 @property 语法结合起来:

@interface MyClass : NSObject //in the .h
@property (readwrite, strong) NSData *fileData;
@end

@implementation MyClass //in the .m
- (void) openFile:(NSString *)pathToFile {
    self.fileData = [NSData dataWithContentsOfFile:pathToFile];
}

- (void) convertFile {
    //whatever you wanted to do to self.fileData
}
@end

【讨论】:

  • 感谢您的回复。具体来说,在我的 Python 脚本中,我的“获取 EDL”按钮只是打开了一个文件请求程序并收集了路径和文件名,并在文本框中显示了所述路径/文件名。然后,我的“转换文件”方法检索了之前收集的路径/文件名,并开始一次一行地解析文件。这就是我头疼的地方......来自“getEDL”:NSURL* filePath = [[openDlg URLs] objectAtIndex:0]; NSString *tempPath = filePath.path;现在我只想在我的转换方法中打开 tempPath。看起来很简单,但我的头很痛。
  • 听起来您几乎完全想要我的第二个示例。将路径存储为属性,在这两种方法中将该属性作为 self.propertyName 访问。
  • 我现在正在 Kochan 的第 5 版书中学习 @property。听起来像我在找什么。当我取得进展时会报告。令人沮丧;每次尝试新事物时,我都觉得我向前迈了 1 步,又后退了 3/4 步。但我会到达那里。感谢您的领导!
  • 通过使用@property 声明,我能够将路径和文件名传递给我的转换方法。还没有完成我的代码,但我又回到了前进的道路上。谢谢一百万!
猜你喜欢
  • 1970-01-01
  • 2017-11-26
  • 2011-03-29
  • 1970-01-01
  • 1970-01-01
  • 2013-06-28
  • 2018-06-26
  • 2018-01-31
  • 1970-01-01
相关资源
最近更新 更多