Следующая функция определяет все возможности и возвращает значение в разделенном запятой (ip, ip и т. д.).
Он также имеет необязательную функцию проверки как (первый параметр, который по умолчанию отключен) для проверки IP-адреса адрес в отношении (закрытый диапазон и зарезервированный диапазон).
<?php
echo GetClientIP(true);
function GetClientIP($validate = False){
$ipkeys = array(
'REMOTE_ADDR',
'HTTP_CLIENT_IP',
'HTTP_X_FORWARDED_FOR',
'HTTP_X_FORWARDED',
'HTTP_FORWARDED_FOR',
'HTTP_FORWARDED',
'HTTP_X_CLUSTER_CLIENT_IP'
);
/*
now we check each key against $_SERVER if contain such value
*/
$ip = array();
foreach($ipkeys as $keyword){
if( isset($_SERVER[$keyword]) ){
if($validate){
if( ValidatePublicIP($_SERVER[$keyword]) ){
$ip[] = $_SERVER[$keyword];
}
}else{
$ip[] = $_SERVER[$keyword];
}
}
}
$ip = ( empty($ip) ? 'Unknown' : implode(", ", $ip) );
return $ip;
}
function ValidatePublicIP($ip){
if(filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_NO_PRIV_RANGE | FILTER_FLAG_NO_RES_RANGE)) {
return true;
}
else {
return false;
}
}
Я не уверен, как недавно это было добавлено, или оно настолько гибкое, насколько вам нужно, но я заметил, что вы можете указать «Чередующиеся» строки в Интерфейсном Разработчике в Xcode 4.6 (и, возможно, ранее).
NSTableView
или NSOutlineView
Highlight Alternating Rows
флажок.
Ответ Нейта Торна отлично сработал для меня.
Вот оно, рефакторинг для Свифта:
import Foundation
import Cocoa
import AppKit
public class SubclassedTableView : NSTableView {
private func
alternateBackgroundColor() -> NSColor? {
return NSColor.redColor() // Return any color you like
}
public override func
drawBackgroundInClipRect(clipRect: NSRect) {
if alternateBackgroundColor() == nil {
// If we didn't set the alternate colour, fall back to the default behaviour
super.drawBackgroundInClipRect(clipRect)
} else {
// Fill in the background colour
self.backgroundColor.set()
NSRectFill(clipRect)
// Check if we should be drawing alternating coloured rows
if usesAlternatingRowBackgroundColors {
// Set the alternating background colour
alternateBackgroundColor()!.set()
// Go through all of the intersected rows and draw their rects
var checkRect = bounds
checkRect.origin.y = clipRect.origin.y
checkRect.size.height = clipRect.size.height
let rowsToDraw = rowsInRect(checkRect)
var curRow = rowsToDraw.location
repeat {
if curRow % 2 != 0 {
// This is an alternate row
var rowRect = rectOfRow(curRow)
rowRect.origin.x = clipRect.origin.x
rowRect.size.width = clipRect.size.width
NSRectFill(rowRect)
}
curRow++
} while curRow < rowsToDraw.location + rowsToDraw.length
// Figure out the height of "off the table" rows
var thisRowHeight = rowHeight
if gridStyleMask.contains(NSTableViewGridLineStyle.SolidHorizontalGridLineMask)
|| gridStyleMask.contains(NSTableViewGridLineStyle.DashedHorizontalGridLineMask) {
thisRowHeight += 2.0 // Compensate for a grid
}
// Draw fake rows below the table's last row
var virtualRowOrigin = 0.0 as CGFloat
var virtualRowNumber = numberOfRows
if numberOfRows > 0 {
let finalRect = rectOfRow(numberOfRows-1)
virtualRowOrigin = finalRect.origin.y + finalRect.size.height
}
repeat {
if virtualRowNumber % 2 != 0 {
// This is an alternate row
let virtualRowRect = NSRect(x: clipRect.origin.x, y: virtualRowOrigin, width: clipRect.size.width, height: thisRowHeight)
NSRectFill(virtualRowRect)
}
virtualRowNumber++
virtualRowOrigin += thisRowHeight
} while virtualRowOrigin < clipRect.origin.y + clipRect.size.height
// Draw fake rows above the table's first row
virtualRowOrigin = -1 * thisRowHeight
virtualRowNumber = -1
repeat {
if abs(virtualRowNumber) % 2 != 0 {
// This is an alternate row
let virtualRowRect = NSRect(x: clipRect.origin.x, y: virtualRowOrigin, width: clipRect.size.width, height: thisRowHeight)
NSRectFill(virtualRowRect)
}
virtualRowNumber--
virtualRowOrigin -= thisRowHeight
} while virtualRowOrigin + thisRowHeight > clipRect.origin.y
}
}
}
}
Если Вы хотите выбрать пользовательский цвет, соединенный с данными в каждой строке, я нашел этот способ сделать так благодаря сообщениям здесь выше, и это решение также работает для реализации пользовательского альтернативного цвета строки (за исключением пустых строк):
создают подкласс NSTableView:
ColoredRowTableView.h
@protocol ColoredRowTableViewDelegate <NSTableViewDelegate>
-(NSColor *)colorForRow:(NSInteger)row;
@end
@interface ColoredRowTableView : NSTableView
@end
в ColoredRowTableView.m
- (void)drawRow:(NSInteger)row clipRect:(NSRect)clipRect
{
if (row == [self selectedRow])
{
[super drawRow:row clipRect:clipRect];
return;
}
NSColor *color = [(id<ColoredRowTableViewDelegate>)[self delegate] colorForRow:row];
[color setFill];
NSRectFill([self rectOfRow:row]);
[super drawRow:row clipRect:clipRect];
}
затем в Вашем делегате табличного представления:
#import "ColoredRowTableView.h"
@interface MyTableViewDelegate : NSViewController <ColoredRowTableViewDelegate>
// instead of <NSTableViewDelegate>
реализуют colorForRow: метод в Вашем делегате. Если цель только для обеспечения альтернативной строки, она может возвратить цвет на основе номера строки, если это даже или нечетно. Также не забывайте изменять класс своего табличного представления к ColoredRowTableView в интерфейсном разработчике