此主题here和here上已有2个未答复的帖子,其中没有人提供此问题的有效解决方案。
第一张图片显示了搜索控制器的iOS 10行为,您可以在其中看到左侧的层次结构,右侧的搜索控制器框架以红色框起。在中心以蓝色查看是在表格中正确显示的。
第二张图显示了iOS 11的行为,其中搜索控制器退出tableView
标题的边界,并移动到屏幕顶部没有任何意义,因为表格视图位于距离顶部230像素的位置屏幕。
我用来显示所有这些的代码如下(在viewDidLoad
中):
self.definesPresentationContext = YES;
self.searchController = [[UISearchController alloc] initWithSearchResultsController:nil];
self.searchController.searchResultsUpdater = self;
self.searchController.dimsBackgroundDuringPresentation = NO;
self.searchController.searchBar.delegate = self;
self.searchController.searchBar.clipsToBounds = YES;
self.tableView.tableHeaderView = self.searchController.searchBar;
self.searchController.searchBar.placeholder = @"Enter name or email";
[self.searchController.searchBar sizeToFit];
答案 0 :(得分:3)
自iOS11以来,搜索控件是导航栏的一部分。您需要以下内容
<强>目标C 强>
//Adapter
public class MapAdapter extends XmlAdapter<List<ProtocolBase>,Map<String,ProtocolBase>>{
@Override
public List<ProtocolBase> marshal(Map<String,ProtocolBase> map){
return new ArrayList<ProtocolBase>(map.values());
}
@Override
public Map<String,ProtocolBase> unmarshal(List<ProtocolBase> lst){
Map<String,ProtocolBase> map = new HashMap<>();
for(ProtocolBase p : lst){
map.put(p.getClass().getSimpleName(),p);
}
return map;
}
}
//Base Class
@XmlAccessorType(XmlAccessType.FIELD)
@XmlSeeAlso({ArrayList.class,Protocol1.class})
public class ProtocolBase {
public ProtocolBase() {
// TODO Auto-generated constructor stub
}
}
//Derived class
@JsonRootName( "Protocol1")
@XmlAccessorType(XmlAccessType.FIELD)
public class Protocol1 extends ProtocolBase{
@XmlAttribute(name="Name")
@JsonProperty("Name")
private String _name;
}
@JsonRootName( "Protocol2")
@XmlAccessorType(XmlAccessType.FIELD)
public class Protocol2 extends ProtocolBase{
@XmlAttribute(name="Name")
@JsonProperty("Name")
private String _name;
}
//Main class
@XmlAccessorType(XmlAccessType.FIELD)
@XmlRootElement(name = "Data")
@JsonRootName("Data")
@XmlSeeAlso({ArrayList.class,Protocol1.class,ProtocolBase.class})
public class Data {
@XmlJavaTypeAdapter(MapAdapter.class)
@XmlElements({
@XmlElement(name="Protocol1",type=Protocol1.class)
})
private Map<String,ProtocolBase> protocolList = new HashMap<String, ProtocolBase>();
}
// Usage
device = new Data();
Protocol1 p1 = new Protocol1();
p1.set_name("ADT");
Protocol2 p2 = new Protocol2();
p2.set_name("ADT1");
device.getProtocolList().put("Protocol1",(SSDeviceProtocol) p1);
device.getProtocolList().put("Protocol2",(SSDeviceProtocol) p2);
JAXBContext jc = (JAXBContext) JAXBContext.newInstance();
Marshaller m = jc.createMarshaller();
m.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true);
m.marshal(device, System.out);
//Expected output
<Data>
<Protocol1 Name="ADT"/>
<Protocol2 Name="ADT1"/>
</Data>
<强>夫特强>
if (@available(iOS 11.0, *)) {
self.navigationItem.searchController = searchController
} else {
self.tableView.tableHeaderView = searchController.searchBar
}
答案 1 :(得分:0)
以下是来自故事板的视图控制器中tableView的约束。
var tableConstraints: [NSLayoutConstraint] {
var constraints = [NSLayoutConstraint]()
constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .left, relatedBy: .equal,
toItem: self.view, attribute: .left, multiplier: 1.0, constant: 1.0))
constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .right, relatedBy: .equal,
toItem: self.view, attribute: .right, multiplier: 1.0, constant: 1.0))
constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .top, relatedBy: .equal,
toItem: self.view, attribute: .top, multiplier: 1.0, constant: 1.0))
constraints.append(NSLayoutConstraint(item: self.tableViewMyMedia, attribute: .bottom, relatedBy: .equal,
toItem: self.view, attribute: .bottom, multiplier: 1.0, constant: 1.0))
return constraints
}
现在添加搜索栏并像这样添加此约束
let search = UISearchController(searchResultsController: nil)
search.searchResultsUpdater = self
self.navigationItem.searchController = search
NSLayoutConstraint.activate(tableConstraints) // important
并检查,向上和向下滚动时不跳跃。
答案 2 :(得分:0)
尝试使用
searchController.hidesNavigationBarDuringPresentation = NO;
结果会让您感到惊讶!