0

私はObjective CとXcodeに非常に慣れていないため、何か愚かなことをしている可能性がありますが、さまざまな提案を試してみましたが、それらを機能させることができません.

つまり、別の UIViewController でボタンが押されたときに、既存の UIViewController でメソッドを呼び出したいと考えています。

(少し背景: 2 つの画面はメイン画面メニュー画面です。ユーザーが上にスワイプしてメニューを表示し、[完了] ボタンが押されたときに、メニュー画面から文字列変数 (この場合は URL) を送信する必要があります)メイン画面のメソッドに追加すると、メイン画面はその URL を UIWebView に表示します)。

method/URL 変数を AppDelegate/MainViewController に入れて合成してみました。また、MenuViewController を MainViewCOntroller のサブクラスにし、[super readFile:url] を使用してメソッドを呼び出しようとしましたが、コンパイルは行われましたが、webview が表示されなかったため、既存の MainViewController オブジェクトで呼び出されたとは思いません。

コードの関連部分を以下に貼り付けます: (ご協力ありがとうございます!)

MainViewController.h

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController {
IBOutlet UIWebView *vCodeView;
}

- (void)readFile:(NSString *)newURL;

@end

MainViewController.m

#import "MainViewController.h"
#import "MenuViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (void)readFile:(NSString *)newURL {
    vCodeView.hidden = NO;

    // seperate url by full stops
    NSArray *splitURL = [newURL componentsSeparatedByString:@"."];
    // find extension of file
    NSString *extension = [splitURL objectAtIndex:([splitURL count]-1)];

    // DO SOME OTHER STUFF WITH URL THEN DISPLAY CONTENT IN UIWEBVIEW
}

- (void)swipeUpRecognised {
    MenuViewController *menuView = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil];
    menuView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentViewController:menuView animated:YES completion:nil];
}

MenuViewController.h

#import <UIKit/UIKit.h>
#import "MainViewController.h"

@interface MenuViewController : UIViewController {
    IBOutlet UIBarButtonItem *bDone;
    IBOutlet UITextField *fUser;
    IBOutlet UITextField *fPass;
    IBOutlet UITextField *fAddress;
    IBOutlet UITextField *fAutoConnectAddress;
}

- (IBAction)bDonePressed;

@end

MenuViewController.m

#import "MenuViewController.h"
#import "MainViewController.h"

@interface MenuViewController ()

@end

@implementation MenuViewController

- (IBAction)bDonePressed {

    NSString *user = @"admin";
    NSString *pass = @"password";
    NSString *path = @"54.246.90.95/repos/project1/trunk/dir1/test.c";

    // url of file
    NSArray *pathArray = [[NSArray alloc] initWithObjects:@"http://", user, @":", pass, @"@", path, nil];
    NSString *url = [pathArray componentsJoinedByString:@""];

    //call the method here passing in url

    [self dismissViewControllerAnimated:YES completion:nil];
}
4

3 に答える 3

1

dismissViewControllerAnimatedこの特定のケースでは、呼び出しの前に次を入れることができ、それは機能するはずです:

if(self.presentingViewController && [self.presentingViewController respondsToSelector:@selector(readFile:)]) {
    [(id)self.presentingViewController readFile:url];
}

一般に、実際に必要なものはDelegationと呼ばれます。

したがって、よりクリーンな実装のために、これを試してください:

MenuViewController.h

@protocol MenuViewControllerDelegate <NSObject>
    - (void)menuViewControllerFinishedWithURL:(NSURL *)url;
@end

@interface MenuViewController : UIViewController {
    @property id<MenuViewControllerDelegate> delegate;
// ...

MenuViewController.m

- (IBAction)bDonePressed {
    // ...

    if(self.delegate) {
        [self.delegate menuViewControllerFinishedWithURL:url];
    }

    [self.presentingViewController dismissViewControllerAnimated:YES completion:nil];
}

MainViewController.m

@interface MainViewController () <MenuViewControllerDelegate>

@end

// ...

- (void)swipeUpRecognised {
    MenuViewController *menuView = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil];
    menuView.delegate = self;
    menuView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentViewController:menuView animated:YES completion:nil];
}
于 2013-03-15T12:06:44.117 に答える
0

MainViewControllerメソッドを呼び出すために、次のようにするのは簡単です。

  1. MainViewController.hをMenuViewController.hにインクルードします。
  2. このスニペットを必要な場所に呼び出します。

    NSString * vcid = @""; //put id you have assigned to your MainViewController. This should be in your storyboard. If it is empty, fill it with proper name, then use it here.
    UIStoryboard *storybord = [UIStoryboard storyboardWithName:@"MainStoryboard" bundle:nil];
    MainViewController *mainvc =[storybord instantiateviewcontrollerwithidentifier:vcid];
    [mainvc method];
    

method呼び出すには、MainViewController.hファイルで宣言する必要があることに注意してください。

そうは言っても、メニュー用に別のViewControllerを用意するというあなたのデザインが本当に必要なのだろうか。選択のためにいくつかのボタンのセットをユーザーに提供したい場合は、それらすべてを含むUIViewを検討してください。次に、このUIViewがにポップアップ表示されますswipeUpRecognised

于 2013-03-15T12:02:34.023 に答える
0

このコードはあなたのために働くでしょう...あなたのコードをこのように修正してください....

MainViewController.h

#import <UIKit/UIKit.h>

@interface MainViewController : UIViewController {
IBOutlet UIWebView *vCodeView;
}

- (void)readFile:(NSString *)newURL;

@end

MainViewController.m

#import "MainViewController.h"
#import "MenuViewController.h"

@interface MainViewController ()

@end

@implementation MainViewController

- (void)readFile:(NSString *)newURL {
    vCodeView.hidden = NO;

    // seperate url by full stops
    NSArray *splitURL = [newURL componentsSeparatedByString:@"."];
    // find extension of file
    NSString *extension = [splitURL objectAtIndex:([splitURL count]-1)];

    // DO SOME OTHER STUFF WITH URL THEN DISPLAY CONTENT IN UIWEBVIEW
}

- (void)swipeUpRecognised {
    MenuViewController *menuView = [[MenuViewController alloc] initWithNibName:@"MenuViewController" bundle:nil];
menuView.delegate = self;
    menuView.modalTransitionStyle = UIModalTransitionStyleCoverVertical;
    [self presentViewController:menuView animated:YES completion:nil];
}

MenuViewController.h

#import <UIKit/UIKit.h>
#import "MainViewController.h"

@interface MenuViewController : UIViewController {
    IBOutlet UIBarButtonItem *bDone;
    IBOutlet UITextField *fUser;
    IBOutlet UITextField *fPass;
    IBOutlet UITextField *fAddress;
    IBOutlet UITextField *fAutoConnectAddress;
}
@property(nonatomic, retain) MainViewController *delegate;
- (IBAction)bDonePressed;

@end

MenuViewController.m

#import "MenuViewController.h"
#import "MainViewController.h"

@interface MenuViewController ()

@end

@implementation MenuViewController
@synthesize delegate = _delegate;
- (IBAction)bDonePressed {

    NSString *user = @"admin";
    NSString *pass = @"password";
    NSString *path = @"54.246.90.95/repos/project1/trunk/dir1/test.c";

    // url of file
    NSArray *pathArray = [[NSArray alloc] initWithObjects:@"http://", user, @":", pass, @"@", path, nil];
    NSString *url = [pathArray componentsJoinedByString:@""];

    //call the method here passing in url
    [self.delegate readFile:url];

    [self dismissViewControllerAnimated:YES completion:nil];
}
于 2013-03-15T12:09:53.793 に答える