2016-08-23 2 views
1

Так что я пытаюсь изменить значение bool с помощью UISwitch в моем проекте. Переключатель расположен справа от моей ячейки и удерживается на месте с ограничениями, добавленными через Interface Builder.Ограничения UISwitch и анимация break на tableview.reloadData()

Я подключил коммутатор для вызова метода switchChanged, который устанавливает значение bool, а затем перезагружает таблицуView для отражения измененного значения.

Коммутатор работает правильно, устанавливая значение bool при его переключении. Однако, когда метод switchChanged вызывает self.tableView.reloadData(), коммутатор перемещается в верхнем левом углу ячейки, и он больше не анимируется, хотя он все еще функционирует должным образом. Что-то ломает коммутатор, но как начинающий разработчик iOS, я не уверен, как начать поиск и устранение неполадок.

Вот соответствующий код:

cellSwitch.addTarget(self, action: #selector(self.switchChanged), 
    forControlEvents: UIControlEvents.TouchUpInside) 

И потом:

func switchChanged(sender: UISwitch) -> Void { 
    print("Switch changed to \(sender.on).") 

    if sender.on { 
     self.acknowledged = "confirmed" 
    } else { 
     self.acknowledged = "conflicted" 
    } 
    tableView.reloadData() 
} 

Как-то tableView.reloadData() линия ломает переключатель. Все остальное работает, кроме положения переключателя и анимации. Любая помощь приветствуется!

Edit:

Метод switchChanged() реализован на мой взгляд контроллера.

Вот ограничения, упомянутые выше:

These

+1

Вы должны показать ограничения, которые вы добавили. Кроме того, где реализован метод 'switchChanged()'? В ячейке или контроллере представления? – Abizern

+0

'switchChanged()' происходит в контроллере представления – SpacemanDeMars

+0

. Я не получаю ваш вопрос. –

ответ

0

Okay! Я понятия не имею, что здесь происходит, но я понял, как сохранить коммутатор на месте.

Вместо того, чтобы создавать аксессуар, я добавляю цель непосредственно к коммутатору, и все работает так, как ожидалось. Вот обновленный код:

customCell.acknowledgedSwitch.addTarget(self, 
    action: #selector(self.switchChanged), 
    forControlEvents: UIControlEvents.TouchUpInside) 
0

Попробуйте этот код:

ViewController.swift

import UIKit 

class ViewController: UIViewController, UITableViewDataSource, UITableViewDelegate, CellWithSwitchDelegate { 

@IBOutlet var tableView: UITableView! 
var switchOn = true 

override func viewDidLoad() { 
    super.viewDidLoad() 
    // Do any additional setup after loading the view, typically from a nib. 
    tableView.delegate = self 
    tableView.dataSource = self 
} 

override func didReceiveMemoryWarning() { 
    super.didReceiveMemoryWarning() 
    // Dispose of any resources that can be recreated. 
} 

func tableView(tableView: UITableView, numberOfRowsInSection section: Int) -> Int { 
    return 1 
} 

func tableView(tableView: UITableView, cellForRowAtIndexPath indexPath: NSIndexPath) -> UITableViewCell { 
    if let cell = tableView.dequeueReusableCellWithIdentifier("CellWithSwitch") as? CellWithSwitch { 
     cell.delegate = self 
     cell.switcher.on = switchOn 
     return cell 
    } 

    return UITableViewCell() 
} 

func switchValueChanged(cell: CellWithSwitch, sender: UISwitch) { 
    print("Switch changed to \(sender.on).") 
    switchOn = sender.on 

    let indexSet = NSIndexSet(index: 0) 
    tableView.reloadSections(indexSet, withRowAnimation: .Left) 
} 
} 

CellWithSwitch.swift

import UIKit 

protocol CellWithSwitchDelegate { 
func switchValueChanged(cell: CellWithSwitch, sender: UISwitch) 
} 

class CellWithSwitch: UITableViewCell { 

var delegate: CellWithSwitchDelegate? 
@IBOutlet var switcher: UISwitch! 

@IBAction func valueChanged(sender: UISwitch) { 

    if let delegate = self.delegate { 
     delegate.switchValueChanged(self, sender: sender) 
    } 
} 
} 

Main.storyboard

<?xml version="1.0" encoding="UTF-8" standalone="no"?> 
<document type="com.apple.InterfaceBuilder3.CocoaTouch.Storyboard.XIB" version="3.0" toolsVersion="10117" systemVersion="15G31" targetRuntime="iOS.CocoaTouch" propertyAccessControl="none" useAutolayout="YES" useTraitCollections="YES" initialViewController="BYZ-38-t0r"> 
<dependencies> 
    <deployment identifier="iOS"/> 
    <plugIn identifier="com.apple.InterfaceBuilder.IBCocoaTouchPlugin" version="10085"/> 
    <capability name="Constraints to layout margins" minToolsVersion="6.0"/> 
</dependencies> 
<scenes> 
    <!--View Controller--> 
    <scene sceneID="tne-QT-ifu"> 
     <objects> 
      <viewController id="BYZ-38-t0r" customClass="ViewController" customModule="stackoverflow_39104992" customModuleProvider="target" sceneMemberID="viewController"> 
       <layoutGuides> 
        <viewControllerLayoutGuide type="top" id="y3c-jy-aDJ"/> 
        <viewControllerLayoutGuide type="bottom" id="wfy-db-euE"/> 
       </layoutGuides> 
       <view key="view" contentMode="scaleToFill" id="8bC-Xf-vdC"> 
        <rect key="frame" x="0.0" y="0.0" width="600" height="600"/> 
        <autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/> 
        <subviews> 
         <tableView clipsSubviews="YES" contentMode="scaleToFill" alwaysBounceVertical="YES" dataMode="prototypes" style="plain" separatorStyle="default" rowHeight="44" sectionHeaderHeight="28" sectionFooterHeight="28" translatesAutoresizingMaskIntoConstraints="NO" id="kbL-PU-bnt"> 
          <rect key="frame" x="0.0" y="28" width="600" height="572"/> 
          <color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/> 
          <prototypes> 
           <tableViewCell clipsSubviews="YES" contentMode="scaleToFill" selectionStyle="default" indentationWidth="10" reuseIdentifier="CellWithSwitch" id="Xxo-pE-rjH" customClass="CellWithSwitch" customModule="stackoverflow_39104992" customModuleProvider="target"> 
            <rect key="frame" x="0.0" y="28" width="600" height="44"/> 
            <autoresizingMask key="autoresizingMask"/> 
            <tableViewCellContentView key="contentView" opaque="NO" clipsSubviews="YES" multipleTouchEnabled="YES" contentMode="center" tableViewCell="Xxo-pE-rjH" id="bAF-fu-1lQ"> 
             <rect key="frame" x="0.0" y="0.0" width="600" height="43"/> 
             <autoresizingMask key="autoresizingMask"/> 
             <subviews> 
              <switch opaque="NO" contentMode="scaleToFill" horizontalHuggingPriority="750" verticalHuggingPriority="750" contentHorizontalAlignment="center" contentVerticalAlignment="center" on="YES" translatesAutoresizingMaskIntoConstraints="NO" id="gWn-Oz-kuT"> 
               <rect key="frame" x="543" y="6" width="51" height="31"/> 
               <connections> 
                <action selector="valueChanged:" destination="Xxo-pE-rjH" eventType="valueChanged" id="clu-XE-TxT"/> 
               </connections> 
              </switch> 
             </subviews> 
             <constraints> 
              <constraint firstItem="gWn-Oz-kuT" firstAttribute="centerY" secondItem="bAF-fu-1lQ" secondAttribute="centerY" id="DhQ-ae-Twa"/> 
              <constraint firstItem="gWn-Oz-kuT" firstAttribute="trailing" secondItem="bAF-fu-1lQ" secondAttribute="trailingMargin" id="aCN-km-CK1"/> 
             </constraints> 
            </tableViewCellContentView> 
            <color key="backgroundColor" white="0.66666666666666663" alpha="1" colorSpace="calibratedWhite"/> 
            <connections> 
             <outlet property="switcher" destination="gWn-Oz-kuT" id="kG6-g5-aiA"/> 
            </connections> 
           </tableViewCell> 
          </prototypes> 
         </tableView> 
        </subviews> 
        <color key="backgroundColor" white="1" alpha="1" colorSpace="custom" customColorSpace="calibratedWhite"/> 
        <constraints> 
         <constraint firstItem="kbL-PU-bnt" firstAttribute="top" secondItem="y3c-jy-aDJ" secondAttribute="bottom" constant="8" symbolic="YES" id="3Df-X8-7Qt"/> 
         <constraint firstItem="kbL-PU-bnt" firstAttribute="leading" secondItem="8bC-Xf-vdC" secondAttribute="leading" id="Tqy-17-xK7"/> 
         <constraint firstAttribute="trailing" secondItem="kbL-PU-bnt" secondAttribute="trailing" id="iFb-Yl-HBW"/> 
         <constraint firstItem="kbL-PU-bnt" firstAttribute="bottom" secondItem="wfy-db-euE" secondAttribute="top" id="isL-f5-3bE"/> 
        </constraints> 
       </view> 
       <connections> 
        <outlet property="tableView" destination="kbL-PU-bnt" id="9kH-Gx-tmj"/> 
       </connections> 
      </viewController> 
      <placeholder placeholderIdentifier="IBFirstResponder" id="dkx-z0-nzr" sceneMemberID="firstResponder"/> 
     </objects> 
     <point key="canvasLocation" x="753" y="576"/> 
    </scene> 
</scenes> 
</document> 
+0

Вы посмотрели мой код? Что вы думаете о такой реализации? Мне кажется более очевидным. –

Смежные вопросы