アプリのボタンを押すと他のストーリボードを呼び出すようにコードを書いたのですが、unrecognized selector sent to instance というエラーが出ます。たぶん、ボタンの操作設定がよろしくないと思い、ググって調べてみたら、似たようなエラーの際に(sender: UIButton)という部分を追加したら治ったと書いてあったのですが、治りません。
優しい誰か教えてください。よろしくお願いします。下に部分的にソースを貼ります。
enum BtnTag: Int { case Zero = 1, One, Two static let allValues = [Zero, One, Two ] } for btag in BtnTag.allValues { var y = CGFloat(60 * btag.rawValue - 1) var btn = UIButton(frame: CGRectMake(0, y, myAppFrameSize.width, 50)) // サイズを設定する. btn.backgroundColor = UIColor.grayColor() // 背景色を設定する. btn.layer.masksToBounds = true // 枠を丸くする. btn.tag = btag.rawValue btn.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal) switch btn.tag{ // タイトルを設定する // イベントを追加する case 1: btn.setTitle("写真選択", forState: UIControlState.Normal) btn.addTarget(self, action: "callphoto:", forControlEvents: .TouchUpInside) case 2: btn.setTitle("メール", forState: UIControlState.Normal) btn.addTarget(self, action: "callemail:", forControlEvents: .TouchUpInside) case 3: btn.setTitle("やめる", forState: UIControlState.Normal) btn.addTarget(self, action: "callphoto:", forControlEvents: .TouchUpInside) default: break } self.view.addSubview(btn) } func callemail(sender: UIButton!){ //mail画面に移動 let secondViewController: second = self.storyboard?.instantiateViewControllerWithIdentifier("secondvc") as second
self.presentViewController(secondViewController, animated: true, completion: nil)
}
エラーメッセージを部分的にじゃなく、全て書いてください。
あと、ソースコードは、クラス全体を書いてください。
メールボックスにteratailから大量のメールが送られているのに気付き、今、このサイトをみています。
結論から言うとdynamicを追加して、build通りました。 初め、Only members of classes may be dynamicというエラーが出て少し焦ったのですが・・・__moaiさん、Stripeさんのお話を伺うことができたおかげでなんとなく使っていたUIKitへの理解が少し深まりました。もう少しレベルが上がれば、公式のリファレンスもじっくり目を通したいと思います。議論を巻き起こした落書きみたいなソースコードですが下に貼っておきます。ありがとうございました。
import UIKit
class ViewController: UIViewController,UIImagePickerControllerDelegate,UINavigationControllerDelegate {
//ios7以前のサイズに対応
func screenSize() -> CGSize {
let screenSize = UIScreen.mainScreen().applicationFrame.size
if (NSFoundationVersionNumber <= NSFoundationVersionNumber_iOS_7_1) && UIInterfaceOrientationIsLandscape(UIApplication.sharedApplication().statusBarOrientation) {
return CGSizeMake(screenSize.height, screenSize.width)
}
return screenSize
}
override func viewDidLoad() {
super.viewDidLoad()
screenSize()
// Windowの表示領域すべてのサイズ(pixel).
let myAppFrameSize: CGSize = UIScreen.mainScreen().applicationFrame.size
let myScale: CGFloat = UIScreen.mainScreen().scale
enum BtnTag: Int {
case Zero = 1, One, Two
static let allValues = [Zero, One, Two ]
}
for btag in BtnTag.allValues {
var y = CGFloat(60 * btag.rawValue - 1)
var btn = UIButton(frame: CGRectMake(0, y, myAppFrameSize.width, 50))
// サイズを設定する.
btn.backgroundColor = UIColor.grayColor()
// 背景色を設定する.
btn.layer.masksToBounds = true
// 枠を丸くする.
btn.tag = btag.rawValue
btn.setTitleColor(UIColor.whiteColor(), forState: UIControlState.Normal)
switch btn.tag{
// タイトルを設定する
// イベントを追加する
case 1:
btn.setTitle("写真選択", forState: UIControlState.Normal)
btn.addTarget(self, action: "callphoto:", forControlEvents: .TouchUpInside)
case 2:
btn.setTitle("メール", forState: UIControlState.Normal)
btn.addTarget(self, action: "callemail:", forControlEvents: .TouchUpInside)
case 3:
btn.setTitle("やめる", forState: UIControlState.Normal)
btn.addTarget(self, action: "callphoto:", forControlEvents: .TouchUpInside)
default:
break
}
self.view.addSubview(btn)
}
}
func callemail(sender: UIButton!){
//mail画面に移動
let secondViewController: second = self.storyboard?.instantiateViewControllerWithIdentifier("secondvc") as
second
self.presentViewController(secondViewController, animated: true, completion: nil)
}
// Do any additional setup after loading the view, typically from a nib.
func callphoto(sender: UIButton){
//photoalbumから写真を選択
let photop = UIImagePickerControllerSourceType.PhotoLibrary
if UIImagePickerController.isSourceTypeAvailable(photop){
let picker = UIImagePickerController()
picker.sourceType = photop
picker.delegate = self
self.presentViewController(picker, animated: true, completion: nil)
}
}
//画像選択がキャンセルされた時に呼ばれる.
func imagePickerControllerDidCancel(picker: UIImagePickerController) {
// モーダルビューを閉じる
self.dismissViewControllerAnimated(true, completion: nil)
}
//imageviewに保存でjpgにする
func imagePickerController(picker: UIImagePickerController, didFinishPickingMediaWithInfo info: [NSObject : AnyObject]){
let myAppFrameSize: CGSize = UIScreen.mainScreen().applicationFrame.size
var imgi = UIImageView ()
imgi.frame = CGRectMake(0,0,myAppFrameSize.height,myAppFrameSize.width)
let image = info[UIImagePickerControllerOriginalImage] as UIImage
self.view.addSubview(imgi)
imgi.contentMode = UIViewContentMode.ScaleAspectFit
imgi.image = image
//画像をNSDataに変換
let data:NSData = UIImageJPEGRepresentation(image,0.99 )
/// 画像ファイルの保存先パスを生成します(ドキュメントフォルダ直下固定)。
var imagePath: String {
let doc = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true)[0] as String
return doc.stringByAppendingPathComponent("img1.jpg")
}
//ファイルにデータ書き込み
data.writeToFile(imagePath, atomically: true)
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
最後に技術的な討論が出来るってカッコいいことだと思うんだ。
回答1件
あなたの回答
tips
プレビュー