9073


iPhoneアプリを製作中です。  
ポップアップメニュー内に、画像の表示・非表示切り替えの項目を追加するには  
どうすればいいのでしょうか？  
下記サイトを参考にポップアップメニューを追加したのですが、  
<http://www.iosjp.com/dev/archives/tag/qbpopupmenu>  
メニュー内に追加した項目に紐づくメソッドは、引数を使えないようなのです。

[code]

    // ポップアップメニューに項目を追加
    QBPopupMenuItem *item = [QBPopupMenuItem itemWithTitle:@"画像消す" target:self action:@selector(GazouKesu)];
    
    // 追加される項目のメソッド
    - (IBAction)GazouKesu:(UIButton*)sender {
    sender.selected = !sender.selected;
    
    if (sender.selected) {
          self.detailImageView.image = nil;
    
    } else {
        // Update the view.
        [self configureView];
           }
    }
    
[/code]

上記のコードを追加した上で、ポップアップメニュー内の「画像消す」項目を  
押したところ、下記エラーメッセージが表示されました。「指定されたメソッドを  
探しましたがありませんでした」という意味のようです。

[code]

    unrecognized selector sent to instance
    
[/code]

試しに、メソッドのsender引数を削除したところ、項目を押しても落ちません  
でした（もちろん機能もしませんでしたが・・・）。

どなたか解決策をご教示いただけないでしょうか。  
以上、何卒よろしくお願いいたします。


CC BY-SA 3.0
2015-04-12T06:07:22.050
9072
2015-04-14T01:31:36.120
2015-04-12T22:21:07.263
7470
7470
question
objective-c iphone xcode6
ポップアップメニュー内に、画像の表示・非表示切り替えの項目を追加するには


セレクタ（Selector）の記述のしかたから勉強しなおしてください。

[code]

    @selctor(methodName)
    
[/code]

こう記述すると、セレクタに対応するメソッドは、

[code]

    - (void)mothodName {}
    
[/code]

こうなります。

[code]

    @selector(methodName:)
    
[/code]

このように末尾にコロンをつけると、対応するメソッドは、

[code]

    - (void)methodName: (id)sender {}
    
[/code]

引数がひとつ付く形になります。

[code]

    @selector(methodName:info:)
    
[/code]

コロンがふたつになると、

[code]

    - (void)mothodName: (id)sender info: (id)info {}
    
[/code]

引数をふたつ持つメソッドに対応します。

あなたの書いたコード：

[code]

    QBPopupMenuItem *item = [QBPopupMenuItem itemWithTitle:@"画像消す" target:self action:@selector(GazouKesu)];
    
[/code]

これは、こう訂正するといいでしょう。

[code]

    QBPopupMenuItem *item = [QBPopupMenuItem itemWithTitle:@"画像消す" target:self action:@selector(GazouKesu:)];
    
[/code]

これで、`QBPopupMenuItem`のインスタンス`item`から、アクションメソッド`\-
(void)GazouKesu:(id)sender`が呼ばれます。（`(UIButton *)sender`じゃないよ）  
本当に呼ばれているかどうかは、

[code]

    - (void)GazouKesu:(id)sender {
        NSLog(@"The method 'GazouKesu' was called.");
    }
    
[/code]

で、ログ出力して、確認してください。（修正あり）

**追加の回答：**

コメント欄に「`QBPopupMenu`のバグではないか？」と書きました。そのあと、GitHubから`QBPopupMenu`をダウンロードし、プログラムコードを検証してみたところ、バグというか、実装し忘れの箇所を見つけました。  
`QBPopupMenuItemView.m`を開いてください。そして、以下の箇所を修正してください。

[code]

    #pragma mark - Actions
    
    - (void)performAction
    {
        if (self.item.target && self.item.action) {
            // [self.item.target performSelector:self.item.action withObject:nil afterDelay:0]; // withObject:をnilからself.itemに変更。
            [self.item.target performSelector:self.item.action withObject: self.item afterDelay:0];
        }
    
        // Close popup menu
        [self.popupMenu dismissAnimated:YES];
    }
    
[/code]

この修正を施せば、

[code]

    - (void)GazouKesu:(QBPopupMenuItem *)sender {
        NSLog(@"The method 'GazouKesu' was called.");
    }
    
[/code]

のメソッドが呼び出せるようになるでしょう。


CC BY-SA 3.0
2015-04-12T06:27:51.400
9073
2015-04-14T01:31:36.120
2015-04-14T01:31:36.120
7362
7362
9072
answer