2014-12-17 3 views
1

내 IOS 스위프트 앱에서 ActionSheetStringPicker를 사용하려고합니다. 완료 블록이나 성공 동작을 사용하는 방법을 알 수 없습니다.Swift에서 클로저 사용법을 파악할 수 없습니다.

func pickerDone() 
{ 
    println("Here I am!") 
} 

override func touchesBegan(touches: NSSet, withEvent event: UIEvent) 
{ 
    var selected = 0 
    let done: ActionStringDoneBlock = {(picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in 
     println(selectedIndex) 
    } 

    var touch = touches.anyObject() as UITouch 

    if touch.view is UILabel 
    { 
     var picker = ActionSheetStringPicker(title: "Select an attachment", rows: attachmentsList, initialSelection: 0, doneBlock: done, cancelBlock: nil, origin: touch.view) 
     picker.showActionSheetPicker() 
    } 
} 

터치에 반응 요소 내가 ActionSheetStringPicker에서 만든 선택에 따라 텍스트를 변경하려면 attachmentLabel라는 UILabel의,이다 : 여기 내 코드입니다. 그러나 완료 블록 안에 들어가면 전달 된 세 개의 매개 변수 이외에 액세스하려고 할 때마다 EXC_BAD_ACCESS 오류가 발생합니다. 그리고 pickerDone 함수를 성공 동작으로 사용하려고하면 if 매개 변수를 사용하지 않는 함수를 정의합니다.

완료된 블록에서 찾을 수있는 모든 예제는 매개 변수의 값만 인쇄합니다. 피커에서 내 UI로 정보를 가져 오는 방법에 대한 예가 필요합니다.

내 클로저에서 사용할 변수를 캡처하는 방법을 알아 내려고했지만 동일한 EXC_BAD_ACCESS 오류가 발생합니다. 나는 지역을 캡처 시도하지만, 작동하지 않았다 :

var selected = 0 
let done: ActionStringDoneBlock = {(picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in 
    selected = selectedIndex 
} 

을 그럼 내가 자기를 포착했는데, 그 중 하나가 작동하지 않습니다

let done: ActionStringDoneBlock = {[weak self](picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in 
    self?.attachmentLabel.text = self?.attachmentsList[selectedIndex] 
    return 
} 

답변

0

내가 ActionSheetPicker의 소유자입니다. 나는 touchesBegan overriding으로 작업을 시도하지 않았지만 동일해야합니다.

내가 touchesBegan에서 @IBAction에 코드를 포장하려고하고 (후 완료 인쇄 지수는 클릭) 작동 :

func pickerDone() 
{ 
    println("Here I am!") 
} 

@IBAction func functionInvokeByDoneCicked(sender: UIButton) { 
    var picker = ActionSheetStringPicker(title: "title", rows: ["1","2"], initialSelection: 0, target: self, successAction: "pickerDone", cancelAction: nil, origin: sender.superview!.superview) 

    picker.showActionSheetPicker() 
} 
: 수행 블록에서 함수를 실행하는 예를

@IBAction func doneBlockInvokeByDoneClicked(sender: UIButton) { 
     var selected = 0 
     let done: ActionStringDoneBlock = {(picker: ActionSheetStringPicker!, selectedIndex: NSInteger!, selectedValue : AnyObject!) in 
      println(selectedIndex) 
     } 

     var picker = ActionSheetStringPicker(title: "Select an attachment", rows: ["One", "Two", "A lot"], initialSelection: 0, doneBlock: done, cancelBlock: nil, origin: sender.superview!.superview) 

     picker.showActionSheetPicker() 

    } 

을 그리고 여기에

아마도 origin 매개 변수에 문제가 있습니다. touch.view이 기본보기인지 확인하십시오.

+0

여기서 한 것처럼 ActionStringDoneBlock 또는 완료된 블록에서 이미 인쇄 할 수 있습니다. 문제는 인쇄 할 수 없다는 것입니다. 전달 된 것 외의 함수 내에서 변수에 액세스 할 수 없으므로 내 UI로 모든 정보를 다시 가져 오는 방법을 알 수 없습니다. 예를 들어 선택한 인덱스를 인쇄 할 수는 있지만 선택한 인덱스의 값을 UILabel로 가져 오는 것이 좋습니다. – aranha

+0

@aranha 다른 블록이나 콜백 메소드에서와 같은 방식으로. 1) 텍스트 필드'myTextField'를위한 콘센트를 생성하십시오. 2)'println'을'self.myTextField.text = self.arrayWithStrings [selectedIndex]'로 대체하십시오. https://github.com/skywinder/ActionSheetPicker-3.0에서 예제 프로젝트를 확인하십시오.이 액션의 예제를 찾을 수 있습니다. – skywinder

+0

레이블과 문자열 목록이 있습니다 : '@IBOutlet weak var attachmentLabel : UILabel! var attachmentsList = [문자열]()' 목록은 다른 곳에서 채워집니다. 'done : ActionStringDoneBlock = {[weak self] (picker : ActionSheetStringPicker !, selectedIndex : NSInteger!, selectedValue : AnyObject!) var 인덱스 : Int = selectedIndex self? .attachmentLabel. text = self? .attachmentsList [index] }' EXC_BAD_ACCESS 오류로 인해 충돌이 발생합니다. 죄송합니다.이 형식을 멋지게 시도했지만 줄 바꿈을 표시하는 방법을 알아낼 수 없습니다. – aranha

관련 문제