如何使用uiviewcontroller工作的方法类

时间:2013-03-30 05:22:34

标签: ios objective-c

我在想如何为twitter或facebook或其他任何课程上课。所以我只需将该类导入到我的项目中,然后开始使用一个代码。例如。如果我使用twitter框架,那么我必须编写它的函数。我只是想通过导入它来创建一个可以用于我所有未来项目的功能。 例如:

任何课程或任何内容:

-(void)shareOnTwitter:(NSString *)text withUrl:(NSURL *)url withImage:(UIImage *)image
{
   // ALL TWITTER Code HERE;
}

在任何项目的主视图控制器中:

- (IBAction)socialBtn:(id)sender
{
  [self shareOnTwitter:@"This is Text" withUrl:nil withImage:nil];
}

更新:刚尝试分类方式,但没有回复,我知道哪里错了?:

的UIViewController + CustomMethods.h

#import <UIKit/UIKit.h>
#import <Social/Social.h>

@interface UIViewController (CustomMethods)

-(void)shareOnTwitter:(NSString *)text withUrl:(NSURL *)url withImage:(UIImage *)image;

@end

的UIViewController + CustomMethods.m

#import "UIViewController+CustomMethods.h"

@implementation UIViewController (CustomMethods)

-(void)shareOnTwitter:(NSString *)text withUrl:(NSURL *)url withImage:(UIImage *)image {

    if ([SLComposeViewController isAvailableForServiceType:SLServiceTypeTwitter])
    {

        SLComposeViewController *tweetSheet = [SLComposeViewController composeViewControllerForServiceType:SLServiceTypeTwitter];

        [tweetSheet setInitialText:text];
        [tweetSheet addImage:image];
        [tweetSheet addURL:url];

        [self presentViewController:tweetSheet animated:YES completion:nil];
    }
    else
    {
        UIAlertView *alertView = [[UIAlertView alloc]
                                  initWithTitle:@"Sorry"
                                  message:@"You can't Post a Status right now, make sure your device has an internet connection and you have at least one Twitter account setup"
                                  delegate:nil
                                  cancelButtonTitle:@"OK"
                                  otherButtonTitles:nil];
        [alertView show];
    }

}
@end

mainViewController:

NSString *title = [webViewOutlet stringByEvaluatingJavaScriptFromString:@"document.title"];
            NSURL *url = [[webViewOutlet request] URL];

            [self shareOnTwitter:title withUrl:url withImage:nil];

4 个答案:

答案 0 :(得分:4)

我相信这是一个可以使用名为“Categories”的Objective-C功能的实例。类别是已建立的类的扩展。例如,我们可以为UIViewController创建一个类别,它将为所有UIViewController类添加新方法。

为此,我们执行以下操作:

制作.h文件声明原型:

@interface UIViewController (CategoryName) // EG. (Twitter)
// PROTOTYPES... EG:
-(void)shareOnTwitter:(NSString *)text withUrl:(NSURL *)url withImage:(UIImage *)image;
@end

实现它们的相应.m文件:

@implementation UIViewController (CategoryName)
// IMPLEMENTATIONS... EG:
-(void)shareOnTwitter:(NSString *)text withUrl:(NSURL *)url withImage:(UIImage *)image {
    // Code...
}
@end

(请注意,在XCode中声明新文件时,它有一个可以使用的“类别”模板。)

现在,无论何时导入.h文件,UIViewController作为一个类都将包含你扩展它的方法!

Here's我通过快速谷歌搜索找到的类别教程。

答案 1 :(得分:2)

创建NSObject,例如

@interface YourClassName : NSObject
.
.
. // put all methods and ivar..etc that your need. (in Proper way)
.
.

并将所有方法放入其中(方法体[{1}}

只需要.m file 继承

您可以访问#import "YourClassName.h"类中的所有功能

答案 2 :(得分:1)

要创建一个委托,您可以在YourTwitterClass.h

中的接口声明上面添加它
@protocol YourTwitterDelegate <NSObject>
-(void)delegteMethod;
@end

你可以通过继承NSObject

来做这样的事情
//In YourTwitterClass.h
//Twitter framework(needed but I don't know the name)
#import <Twitter/Twitter.h>
#import <UIKit/UIKit.h>

@interface YourTwitterClass : NSObject

@property (nonatomic) id<YourTwitterDelegate> delegate;    
-(void)shareOnTwitter:(NSString *)text withUrl:(NSURL *)url withImage:(UIImage *)image delegate:(id<YourTwitterDelegate>)del;

@end


//in YourTwitterClass.m
@implementation YourTwitterClass
-(void)shareOnTwitter:(NSString *)text withUrl:(NSURL *)url withImage:(UIImage *)image delegate:(id<YourTwitterDelegate>)del{
_delegate = del;
[_delegate delegateMethod];//calls the delegate method
//do twitter stuff
}

然后在你的视图控制器中

//import "YourTwitterClass.h"

- (IBAction)socialBtn:(id)sender
{
YourTwitterClass *t = [[YourTwitterClass alloc] init];
[t shareOnTwitter:@"This is Text" withUrl:nil withImage:nil];
}
//and the delegate method
-(void)delegateMethod{
NSLog(@"This is a delegate method!);
}

ViewController.h文件中,您还必须将其添加到接口声明

修改 如果你想为一个邮件编写器添加一个委托,请添加该类的委托

@interface ViewController : UIViewController <MFMailComposeViewControllerDelegate>
//or
@interface YourTwitterClass : NSObject <MFMailComposeViewControllerDelegate>

答案 3 :(得分:0)

答案使它比实际情况更复杂:

您需要使用mytweet.h和mytweet.m

创建一个如上所述的NSObject类

在你的UIViewController方法中,你需要实例化你创建的自定义类:

#import Mytweet.h;

...

 -(void) viewDidload { ...

    }

然后按如下方式调用方法:

 -(IBACTION) Handletweet{ 

      Mytweet *a = [[Mytweet alloc] init];
      Bool ABC = [Mytweet custom_method1:parameter1 p2:parameter2];}

与Objective C中的任何内容一样,您需要记住,对象具有生成和释放的生命周期(使用ARC自动生成),因此您需要在自定义类的生命周期之外生存的任何参数都需要在自定义类之外创建并作为参数传递。

      Mytweet *a = [[Mytweet alloc] init];
      a.parameter1 = value;

我的tweet.h中的位置

     @property (nonatomic,strong) NSString *parameter1;

Re:Delegates - 委托方法是一种通过调用类覆盖书面方法的方法,这些方法在Apple或第三方框架类中是典型的,因为整个源代码可能不对您开放,对于自定义类,您不要他们需要他们只是根据需要自定义和添加方法到自定义类,你会发现这个结果比其他更清晰的代码