我对编写基于VB的应用程序非常熟悉,但我对Xcode(和Objective C)不熟悉。我在网上经历了大量的教程,了解了基础知识以及如何与Interface Builder等进行交互。但是,我真的在努力学习C语言的一些基本概念,并感谢您提供的任何帮助。继承人我的问题......
我有一个简单的iphone应用程序,它有一个视图控制器(FirstViewController)和一个带有相关标题和类文件的子视图(SecondViewController)。
在FirstViewController.m中定义了一个函数
@implementation FirstViewController
- (void) writeToServer:(const uint8_t *) buf {
[oStream write:buf maxLength:strlen((char*)buf)];
}
功能是什么并不重要。
我想在我的SecondViewController中使用这个函数,所以在SecondViewController.m中我导入了FirstViewController.h
#import "SecondViewController.h"
#import "FirstViewController.h"
@implementation SecondViewController
-(IBAction) SetButton: (id) sender {
NSString *s = [@"Fill:" stringByAppendingString: FillLevelValue.text];
NSString *strToSend = [s stringByAppendingString: @":"];
const uint8_t *str = (uint8_t *) [strToSend cStringUsingEncoding:NSASCIIStringEncoding];
FillLevelValue.text = strToSend;
[FirstViewController writeToServer:str];
}
最后一行是我的问题所在。 XCode告诉我FirstViewController可能不响应writeToServer。 当我尝试运行应用程序时,它会在调用此函数时崩溃。
我想我并不完全理解如何共享函数,更重要的是,类之间的关系。
在一个理想的世界中,我会创建一个全局类来放置我的函数并根据需要调用它们。
感谢任何建议。
答案 0 :(得分:31)
在你的方法的deklaration:
- (void) writeToServer:(const uint8_t *) buf;
声明开头的 - 表示它是一种即时方法。这意味着,您必须创建一个类的实例来调用它。如果有+,则该方法将是一个类方法,您可以按照您在代码中的方式调用它。
示例:
@interface MyClass
{ }
- (void) myInstanceMethod;
+ (void) myClassMethod;
@end
然后在某个功能中:
[MyClass myClassMethod]; // This is ok
//[MyClass myInstanceMethod]; // this doenst't work, you need an instance:
MyClass *theInstance = [[MyClass alloc] init];
[theInstance myInstanceMethod];
答案 1 :(得分:3)
在行中:
[FirstViewController writeToServer:str];
...您正在将消息writeToServer:
发送到FirstViewController
类。相反,您需要将其发送到FirstViewController
对象。这意味着您需要获取对FirstViewController
对象的引用,然后发送对象 writeToServer:
消息:
[firstViewControllerObject writeToServer:str];
但是,由于iPhone上一次只有一个活动视图,因此您不应同时存在FirstViewController
和SecondViewController
个对象并相互通信。相反,您应该创建独立的类来执行所需的类,并且活动视图控制器应该与这些类进行交互。
注意 :“您正在向对象sayHello:
发送消息myObject
”只是另一种说法“你”正在调用对象writeToServer:
的{{1}}方法。(“方法”就像函数的面向对象版本。)
我建议您阅读Learning Objective-C上的Learn Cocoa II和Cocoa Dev Central教程,详细了解Cocoa / Objective-C和object-oriented programming。
答案 2 :(得分:2)
在FirstViewController.h
文件中,您必须在@interface部分声明writeToServer
作为FirstViewController
对象的方法
@interface FirstViewController : UIViewController {
}
- (void) writeToServer:(NSString *) str;
@end
其次,您发送的以下消息无效,因为FirstViewController
writeToServer
不是类方法,仅在从FirstViewController
类的实例化调用时才有效。< / p>
FirstViewController *firstViewCnt = [[FirstViewController alloc] init];
[firstViewCnt writeToServer:str];
[firstViewCnt release];
或类似的东西。
答案 3 :(得分:1)
你需要写:
- (void) writeToServer:(const uint8_t *) buf;
在您的FirstViewController.h文件中。这是编译器的提示,该函数可用于该特定类。如果没有这个代码,你的代码仍然可以正常工作,因为实际的函数是实现的,但是你得到了警告,因为当你包含来自另一个源文件的头文件时,编译器不会检查.m文件中的现有函数。
答案 4 :(得分:0)
如果要像这样调用此方法,只需将writeToServer方法声明为类方法(简称静态方法...)
为此您已声明并将其定义为
+ (void) writeToServer:(const uint8_t *) buf;
+ (void) writeToServer:(const uint8_t *) buf {
[oStream write:buf maxLength:strlen((char*)buf)];
}
唯一的区别是 + 符号,而不是 -
第二个选项是FirstViewController的creat实例,并调用现有方法
即
FirstViewController FirstViewControllerObj = [[FirstViewController alloc] init];
[FirstViewControllerObj writeToServer:str];
答案 5 :(得分:0)
FirstViewController.h
@interface FirstViewController: UIViewController
- (void)GetItNow;
FirstViewController.m
- (void)GetItNow{
NSLog(@"I acheived"); }
- (IBAction)goToSecondView:(id)sender {
SecondViewController* Second= [[SecondViewControlleralloc] initWithNibName:@"SecondViewController" bundle:nil];
rqVC.addId = self.addId;
[self.view addSubview:Second.view];
}
SecondViewController.h
@property (nonatomic, assign) id delegate;
SecondViewController.m
- (IBAction)Action_LoadFunds:(id)sender {
[self.view removeFromSuperview];
[_delegate GetItNow];
}