実際、タイトルには私の質問が含まれています。 UISegmentedControlがあり、現在選択されているタブの選択を解除する必要があります。私は試した:
[menu setSelectedSegmentIndex:-1];
メニューはuisegmentedcontrolのUBOutletですが、これは私に例外を与えます。誰かが何か考えを持っていますか?ピーターありがとう
コードのどこかで適切な[myArray length]
ではなく[myArray count]
を呼び出したと思います。 NSArrayはcountメソッドを使用し、それに含まれるアイテムの数の長さではありません。
これを行う正しい方法は次のとおりです。
[menu setSelectedSegmentIndex:UISegmentedControlNoSegment];
セグメント化されたコントロールで一時的な選択を作成しようとしていると思います。インターフェイスビルダーで、segmentedcontrolを一時的に設定します。またはあなたができるコードで:
menu.momentary = YES;
SegmentedControlを.momentary = YES
に設定すると、ユーザーがsegmentedControlを操作する方法が変わります。ページが読み込まれるときに最初は何も選択したくないが、ユーザーが選択した後、segmentedControlが同じように動作する場合は、次のようなものが必要になります。
Swift 4ソリューション:
@IBOutlet weak var segmentedControl: UISegmentedControl!
self.segmentedControl.selectedSegmentIndex = UISegmentedControlNoSegment
スウィフト4
@IBOutlet weak var segmentControl: UISegmentedControl! {
didSet {
segmentControl.selectedSegmentIndex = UISegmentedControl.noSegment
}
}
これをインターフェースビルダーのxcode 6で行うことができます:
Deselect the 'Selected' option under segmented control behaviour in attributes inspector.
Swiftソリューション:@IBOutlet weak var mySegmentedControl: UISegmentedControl!
およびmySegmentedControl.selectedSegmentIndex = -1
。
私はこの種の相互作用をサポートするクラスをしました:
class UIDeselectableSegmentedControl: UISegmentedControl {
override func touchesEnded(_ touches: Set<UITouch>, with event: UIEvent?) {
let previousSelectedSegmentIndex = self.selectedSegmentIndex
super.touchesEnded(touches, with: event)
if previousSelectedSegmentIndex == self.selectedSegmentIndex {
self.selectedSegmentIndex = UISegmentedControl.noSegment
let touch = touches.first!
let touchLocation = touch.location(in: self)
if bounds.contains(touchLocation) {
self.sendActions(for: .valueChanged)
}
}
}
}
その主な利点は、Storyboard/Xib/ViewCodeが使用しているクラスを変更する必要があるだけで、これはチャームのように機能することです;]