UITableView
提供方法indexPathsForVisibleRows
和visibleCells
,但如何获取可见部分?
答案 0 :(得分:20)
或者真正简单的方法是利用valueForKeyPath和NSSet类:
NSSet *visibleSections = [NSSet setWithArray:[[self.tableView indexPathsForVisibleRows] valueForKey:@"section"]];
基本上,您会在可见行中获取一个节值数组,然后使用此方法填充一个集合以删除重复项。
答案 1 :(得分:8)
Swift版
if let visibleRows = tableView.indexPathsForVisibleRows {
let visibleSections = visibleRows.map({$0.section})
}
答案 2 :(得分:7)
UITableViews使用NSIndexPath存储其单元格。因此,部分没有对象。使用下面的代码,我们可以遍历表并使用可见部分的索引执行操作(我不确定为什么你想要可见部分,因为可见仅表示它们当前在屏幕上,但无论如何)。
for (NSIndexPath* i in [yourTableViewName indexPathsForVisibleRows])
{
NSUInteger sectionPath = [i indexAtPosition:0];
//custom code here, will run multiple times per section for each visible row in the group
}
答案 3 :(得分:1)
我有解决方案。
第一步,每个部分将显示由- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
创建的UIView,它将存储到数组中。
当滚动TableView时,我想要释放不可见的剖面视图,所以我需要知道哪个部分是可见的,跟随功能代码将为此检测,如果视图可见则将其释放。
-(BOOL)isVisibleRect:(CGRect)rect containerView:(UIScrollView*)containerView
{
CGPoint point = containerView.contentOffset;
CGFloat zy = point.y ;
CGFloat py = rect.origin.y + rect.size.height;
if (py - zy <0) {
return FALSE;
}
CGRect screenRect = containerView.frame;
CGFloat by = screenRect.size.height + zy ;
if (rect.origin.y > by) {
return FALSE;
}
return TRUE;
}
(rect
是UIView
部分的框架; containerView
是UITableView
)
通过这种方式,我可以获得UITableView
的可见部分,但我希望SDK可以直接为此目的提供API。
答案 4 :(得分:1)
获取UITableView中可见部分的2步解决方案:
1)将标题视图添加到viewForHeaderInSection
中的可变数组中
2)当tableview在scrollViewDidScroll
请注意使用tag属性来保存节号
@property (nonatomic, strong, readwrite) NSMutableArray *headerArray;
- (UIView *)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section {
UIView *headerView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, tableView.bounds.size.width, 40)];
headerView.backgroundColor = [UIColor greenColor];
headerView.tag = section;
[_headerArray addObject:headerView];
return headerView;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView {
[self updateHeaderArray];
NSLog(@"------------");
for (UIView *view in _headerArray) {
NSLog(@"visible section:%d", view.tag);
}
}
- (void)updateHeaderArray {
// remove invisible section headers
NSMutableArray *removeArray = [NSMutableArray array];
CGRect containerRect = CGRectMake(_tableView.contentOffset.x, _tableView.contentOffset.y,
_tableView.frame.size.width, _tableView.frame.size.height);
for (UIView *header in _headerArray) {
if (!CGRectIntersectsRect(header.frame, containerRect)) {
[removeArray addObject:header];
}
}
[_headerArray removeObjectsInArray:removeArray];
}
答案 5 :(得分:1)
使用kvc
更简单,更简洁NSArray *visibleSections = [self.tableView.indexPathsForVisibleRows valueForKey:@"section"];
这可能会为您提供一个具有重复值的数组,但您可以从那里进行管理。
答案 6 :(得分:1)
for (NSUInteger section = 0; section < self.tableView.numberOfSections; ++section) {
UIView *headerView = [self.tableView headerViewForSection:section];
if (headerView.window) {
NSLog(@"its visible");
}
}
答案 7 :(得分:0)
另一个解决方案,在部分标题视图的标记中使用1位,就像那样
#define _TBL_TAG_SECTION(_TAG) ((_TAG)|(1<<30))
#define _TBL_TAG_CLEAR(_TAG) ((_TAG)&((1<<30)-1))
#define _TBL_TAG_IS_SECTION(_TAG) ((_TAG)>>30)
- (UIView*)tableView:(UITableView *)tableView viewForHeaderInSection:(NSInteger)section
{
// alloc header view
UIView *header = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 1, 1)];
header.tag = _TBL_TAG_SECTION(section);
return header;
}
- (void)scrollViewDidScroll:(UIScrollView *)scrollView
{
CGRect r = CGRectMake(scrollView.contentOffset.x, scrollView.contentOffset.y,
CGRectGetWidth(scrollView.frame),
CGRectGetHeight(scrollView.frame));
for (UIView *v in [_tableView subviews]) {
if ( CGRectIntersectsRect(r, v.frame) ) {
if ( _TBL_TAG_IS_SECTION(v.tag) ) {
NSLog(@"visible section tag %d", _TBL_TAG_CLEAR(v.tag));
}
}
}
}
答案 8 :(得分:0)
self.sections.indices.forEach{ (i:Int) in
let section:UIView? = self.tableView(self, viewForHeaderInSection: i)
}
答案 9 :(得分:0)
您在Swift 4中尝试过吗?
# Define a vector which has different kernel methods
kerna <- c("rbfdot","polydot","vanilladot","tanhdot","laplacedot",
"besseldot","anovadot","splinedot")
# Define a for loop to calculate accuracy for different values of C and kernel
for (ker in kerna){
cValues <- c()
accuracyValues <- c()
for (c in 1:100) {
model <- ksvm(V11~V1+V2+V3+V4+V5+V6+V7+V8+V9+V10,
data = credit_card_data,
type ="C-svc",
kernel = ker,
C=c,
scaled =TRUE)
pred <- predict(model,credit_card_data[,1:10])
#pred
accuracy <- sum(pred== credit_card_data$V11)/nrow(credit_card_data)
cValues[c] <- c;
accuracyValues[c] <- accuracy;
}
for(i in 1:100) {
print(paste("kernal:",ker, "c=",cValues[i],"accuracy=",accuracyValues[i]))
}
}
答案 10 :(得分:0)
Swift 4和Swift 5
import call
call.call_name1('Kevin')
使用方法
extension UITableView {
func returnVisibleCellsIndexes() -> [IndexPath] {
var indexes = [IndexPath]()
for cell in self.visibleCells {
if let indexpath = self.returnIndexPath(cell: cell) {
indexes.append(indexpath)
}
}
return indexes
}
func returnIndexPath(cell: UITableViewCell) -> IndexPath?{
guard let indexPath = self.indexPath(for: cell) else {
return nil
}
return indexPath
}
func returnVisibleCells() -> [UITableViewCell]{
let visiblecell = self.visibleCells
return visiblecell
}
}