2016-05-27 6 views
0

私が何を私が続いていますがalertviewコントローラ私のUIPickerviewがUIAlertcontrollerで動作しないのはなぜですか?

let alertController = UIAlertController(title: "Hey!", message: "MESSAGE?", preferredStyle: .Alert) 
let defaultAction = UIAlertAction(title: "OK", style: .Default, handler: nil) 
alertController.addAction(defaultAction) 

// pickerviewため

let monthlyStatement = UIStoryboard(name: "Second", bundle: nil).instantiateViewControllerWithIdentifier("MonthlyStatement") 
monthlyStatement.view.frame = CGRectMake(0, 0, 280, 260) 
alertController.view.addSubview(monthlyStatement.view) 
presentViewController(alertController, animated: true, completion: nil) 

monthlyStatementピッカーのための

//はこのために、アラートビューコントローラ内のピッカービューを表示する必要がありますビューは完全に表示されますが、スクロールしません。

クリックするといつでも表示されます(ピッカービュー/ピッカービューコンポーネント)、それはすぐに私の警告ビューコントローラを却下します。 どのようにこれらの問題を解決できますか。 ありがとうございます

答えて

0

このように実装することができます。

func showPickerInActionSheet(sentBy: String) { 
    var title = "picker" 
    var message = "Picker controller"; 
    var alert = UIAlertController(title: title, message: message, preferredStyle: UIAlertControllerStyle.ActionSheet); 
    alert.modalInPopover = true; 


    //Create a frame (placeholder/wrapper) for the picker and then create the picker 
    var pickerFrame: CGRect = CGRectMake(17, 52, 270, 100); // CGRectMake(left), top, width, height) - left and top are like margins 
    var picker: UIPickerView = UIPickerView(frame: pickerFrame); 

    /* If there will be 2 or 3 pickers on this view, I am going to use the tag as a way 
    to identify them in the delegate and datasource. /* This part with the tags is not required. 
    I am doing it this way, because I have a variable, witch knows where the Alert has been invoked from.*/ 
    if(sentBy == "profile"){ 
     picker.tag = 1; 
    } else if (sentBy == "user"){ 
     picker.tag = 2; 
    } else { 
     picker.tag = 0; 
    } 

    //set the pickers datasource and delegate 
    picker.delegate = self; 
    picker.dataSource = self; 

    //Add the picker to the alert controller 
    alert.view.addSubview(picker); 

    //Create the toolbar view - the view witch will hold our 2 buttons 
    var toolFrame = CGRectMake(17, 5, 270, 45); 
    var toolView: UIView = UIView(frame: toolFrame); 

    //add buttons to the view 
    var buttonCancelFrame: CGRect = CGRectMake(0, 7, 100, 30); //size & position of the button as placed on the toolView 

    //Create the cancel button & set its title 
    var buttonCancel: UIButton = UIButton(frame: buttonCancelFrame); 
    buttonCancel.setTitle("Cancel", forState: UIControlState.Normal); 
    buttonCancel.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal); 
    toolView.addSubview(buttonCancel); //add it to the toolView 

    //Add the target - target, function to call, the event witch will trigger the function call 
    buttonCancel.addTarget(self, action: "cancelSelection:", forControlEvents: UIControlEvents.TouchDown); 


    //add buttons to the view 
    var buttonOkFrame: CGRect = CGRectMake(170, 7, 100, 30); //size & position of the button as placed on the toolView 

    //Create the Select button & set the title 
    var buttonOk: UIButton = UIButton(frame: buttonOkFrame); 
    buttonOk.setTitle("Select", forState: UIControlState.Normal); 
    buttonOk.setTitleColor(UIColor.blueColor(), forState: UIControlState.Normal); 
    toolView.addSubview(buttonOk); //add to the subview 

    //Add the tartget. In my case I dynamicly set the target of the select button 
    if(sentBy == "profile"){ 
     buttonOk.addTarget(self, action: "saveProfile:", forControlEvents: UIControlEvents.TouchDown); 
    } else if (sentBy == "user"){ 
     buttonOk.addTarget(self, action: "saveUser:", forControlEvents: UIControlEvents.TouchDown); 
    } 

    //add the toolbar to the alert controller 
    alert.view.addSubview(toolView); 

    self.presentViewController(alert, animated: true, completion: nil); 
} 

func saveProfile(sender: UIButton){ 
    // Your code when select button is tapped 

} 

func saveUser(sender: UIButton){ 
    // Your code when select button is tapped 
} 

func cancelSelection(sender: UIButton){ 
    println("Cancel"); 
    self.dismissViewControllerAnimated(true, completion: nil); 
    // We dismiss the alert. Here you can add your additional code to execute when cancel is pressed 
} 

// returns number of rows in each component.. 
func pickerView(pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int{ 
    if(pickerView.tag == 1){ 
     return self.profilesList.count; 
    } else if(pickerView.tag == 2){ 
     return self.usersList.count; 
    } else { 
     return 0; 
    } 
} 

// Return the title of each row in your picker ... In my case that will be the profile name or the username string 
func pickerView(pickerView: UIPickerView, titleForRow row: Int, forComponent component: Int) -> String! { 
    if(pickerView.tag == 1){ 

      var selectedProfile: Profiles = self.profilesList[row] as Profiles; 
      return selectedProfile.profileName; 

    } else if(pickerView.tag == 2){ 

      var selectedUser: Users = self.usersList[row] as Users; 
      return selectedUser.username; 

    } else { 

     return ""; 

    } 

} 

func pickerView(pickerView: UIPickerView, didSelectRow row: Int, inComponent component: Int) { 
    if(pickerView.tag == 1){ 
      var choosenProfile: Profiles = profilesList[row] as Profiles; 
      self.selectedProfile = choosenProfile.profileName; 
    } else if (pickerView.tag == 2){ 
      var choosenUser: Profiles = usersList[row] as Users; 
      self.selectedUsername = choosenUser.username; 
    } 

} 
+0

最近、あなたの投稿に返信して申し訳ありませんが、私はこれで作業します。何か問題があれば、私はあなたのコードのおかげで投稿します – WeCan

1
alertController.view.addSubview(monthlyStatement.view) 

それを行うことはありませんでしください。アラートコントローラのビューを手動で変更することはありません。そのためのものではありません。ピッカーをアラートに表示する必要がある場合は、アラートのような表示されたビューコントローラーを作成します。あなたは問題を引き起こしているインターフェースと解雇行動の両方を完全に制御することになります。

+0

あなたのポストに最近返信して申し訳ありません&このノートを指摘していただきありがとうございます。私は今この方法で動作します – WeCan

+0

私はここにダウンロード可能なサンプルプロジェクトがあります:https://github.com/mattneub/custom-alert-view-iOS7もちろん、ピッカーの表示はありませんが、これは細部までのものです。しかし、プロパティビューのコントローラ階層を持たずに、ビューコントローラのビューをインターフェイスに直接貼り付けるという、2番目の違法なこともしていることに注意してください。 – matt

関連する問題